হ্যাঁ, স্থানীয় ভেরিয়েবলের আজীবন সময়টি ( {
, }
) তৈরি করা হয় যেখানে এটি তৈরি করা হয়।
স্থানীয় ভেরিয়েবলগুলির স্বয়ংক্রিয় বা স্থানীয় স্টোরেজ রয়েছে। স্বয়ংক্রিয় কারণ সেগুলি তৈরি হওয়ার সুযোগটি শেষ হলে তারা স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে যায়।
যাইহোক, আপনার এখানে যা আছে তা একটি স্ট্রিং আক্ষরিক, যা একটি বাস্তবায়ন সংজ্ঞায়িত পঠনযোগ্য মেমরির মধ্যে বরাদ্দ করা হয়। স্ট্রিং লিটারালগুলি স্থানীয় ভেরিয়েবল থেকে পৃথক এবং প্রোগ্রামের আজীবন এগুলি জীবিত থাকে। তাদের স্থায়ী সময়কাল [রেফার 1] আজীবন রয়েছে।
সাবধানতার কথা!
তবে নোট করুন যে স্ট্রিং আক্ষরিক বিষয়বস্তুগুলিকে সংশোধন করার যে কোনও প্রয়াস হ'ল একটি অপরিজ্ঞাত আচরণ (ইউবি)। ব্যবহারকারী প্রোগ্রামগুলিকে স্ট্রিং আক্ষরিক বিষয়বস্তু সংশোধন করার অনুমতি নেই।
সুতরাং, const
স্ট্রিংকে আক্ষরিক ঘোষণা করার সময় কিছুটা সময় ব্যবহার করতে এটি সর্বদা উত্সাহিত হয় ।
const char*p = "string";
পরিবর্তে,
char*p = "string";
প্রকৃতপক্ষে, সি ++ তে এটি স্ট্রিংকে আক্ষরিক হিসাবে ঘোষণা করা হ্রাস করা হয়েছে const
যদিও সি তে নেই তবে যাইহোক, স্ট্রিংকে আক্ষরিক ঘোষণা const
দিয়ে আপনাকে এই সুবিধাটি দেওয়া হয় যে আপনি স্ট্রিংকে আক্ষরিক সংশোধন করার চেষ্টা করলে কম্পাইলাররা সাধারণত আপনাকে একটি সতর্কতা দেয় দ্বিতীয় কেস
নমুনা প্রোগ্রাম :
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source);
strcpy(str2,source);
return 0;
}
আউটপুট:
সিসি 1: সতর্কতাগুলি ত্রুটিগুলি
প্রগ হিসাবে বিবেচিত হবে :
ফাংশনটিতে 'প্রধান': প্রগ্যাক: 9: ত্রুটি: ' স্ট্রাইকপি'-র 1 টি আর্গুমেন্ট পয়েন্টার টার্গেট টাইপ থেকে বাছাইয়ের যোগ্যতা ছাড়বে
লক্ষ্য করুন যে সংকলকটি দ্বিতীয় মামলার জন্য সতর্ক করে, তবে প্রথমটির জন্য নয়।
বেশ কয়েকটি ব্যবহারকারী এখানে জিজ্ঞাসা করা প্রশ্নের উত্তর দিতে:
অবিচ্ছেদ্য আক্ষরিক সাথে কি চুক্তি?
অন্য কথায়, নিম্নলিখিত কোডটি বৈধ?
int *foo()
{
return &(2);
}
উত্তরটি হল, কোনও এই কোডটি বৈধ নয়। এটি দুর্গঠিত এবং একটি সংকলক ত্রুটি দেবে।
কিছুটা এইরকম:
prog.c:3: error: lvalue required as unary ‘&’ operand
স্ট্রিং লিটারেলগুলি হ'ল এল-মান, যেমন: আপনি স্ট্রিং আক্ষরিকের ঠিকানা নিতে পারেন, তবে এর সামগ্রীগুলি পরিবর্তন করতে পারবেন না।
যাইহোক, অন্য কোন লিটারেল ( int
, float
, char
, ইত্যাদি) R-মান (সি মান শব্দটি ব্যবহার হয় একটি অভিব্যক্তি মান এবং তাদের ঠিকানা আদৌ নেওয়া যাবে না এই জন্য)।
[রেফার 1] সি 99 স্ট্যান্ডার্ড 6.4.5 / 5 "স্ট্রিং লিটারালস - শব্দার্থবিজ্ঞান":
অনুবাদ পর্বে In-এ, বাইট বা মান শূন্যের কোডটি প্রতিটি মাল্টবাইট চরিত্রের অনুক্রমের সাথে যুক্ত হয় যা স্ট্রিং আক্ষরিক বা আক্ষরিক থেকে ফলাফল results মাল্টিবাইট চরিত্রের সিক্যুয়েন্সটি পরে স্থির স্টোরেজ সময়কাল এবং সিক্যুয়েন্সটি পর্যাপ্ত রাখার জন্য যথেষ্ট দৈর্ঘ্যের একটি অ্যারে শুরু করতে ব্যবহৃত হয় । চরিত্রের স্ট্রিং লিটারালগুলির জন্য, অ্যারের উপাদানগুলিতে টাইপ চর থাকে এবং মাল্টিবাইট অক্ষর ক্রমের পৃথক বাইটগুলির সাথে আরম্ভ করা হয়; প্রশস্ত স্ট্রিং লিটারালগুলির জন্য, অ্যারের উপাদানগুলির মধ্যে wchar_t টাইপ থাকে এবং বিস্তৃত অক্ষরের ক্রম দিয়ে শুরু করা হয় ...
এই অ্যারেগুলি পৃথক পৃথক কিনা এগুলি নির্ধারিত নয় যদি তাদের উপাদানগুলির উপযুক্ত মান থাকে। প্রোগ্রামটি যদি এমন অ্যারে সংশোধন করার চেষ্টা করে তবে আচরণটি সংজ্ঞায়িত ।
int rc
। এর জীবদ্দশায় প্রতিটি এক-এ শেষ হয়return
। আপনি যে পয়েন্টারগুলি ফিরিয়ে দিচ্ছেন তা হ'ল স্ট্রিংগুলিতে। স্ট্রিং লিটারেলের স্থিতিশীল স্টোরেজ সময়কাল থাকে: তাদের জীবনকাল কমপক্ষে প্রোগ্রামের মতো দীর্ঘ হয়।