সি-তে স্ট্রিং হ্যান্ডল করার দুটি সাধারণ উপায়: char s[] (অ্যারে) এবং char *s (পয়েন্টার)। এই দুটির মেমরি লে-আউট এবং ব্যবহারে বড় পার্থক্য রয়েছে।
মূল পার্থক্য
| বিষয় | char s[] | char *s |
|---|---|---|
| টাইপ | অ্যারে | পয়েন্টার |
| মেমরি লোকেশন (স্ট্যাক) | পুরো স্ট্রিং স্ট্যাকে থাকে | পয়েন্টার স্ট্যাকে, কন্টেন্ট কোড সেকশনে (রিড-অনলি) |
sizeof(s) | স্ট্রিংয়ের টোটাল বাইট (নাল টার্মিনেটর সহ) | পয়েন্টার সাইজ (৪ বা ৮ বাইট) |
| মডিফাই করা যায়? | হ্যাঁ | না (অনডিফাইনড বিহেভিয়ার / সেগমেন্টেশন ফল্ট) |
উদাহরণ ১: char s[] — মডিফাই করা যায়
#include <stdio.h>
int main() {
char s[] = "Hello World";
s[6] = 'x'; // পজিশন ৬ (০-বেসড) এ 'W'-কে 'x' করলাম
printf("%s", s);
return 0;
}
আউটপুট
Hello xorld
এডিট সফল হয়েছে কারণ অ্যারে স্ট্যাকে রয়েছে এবং রাইটেবল।
উদাহরণ ২: char *s — মডিফাই করা যায় না
#include <stdio.h>
int main() {
char *s = "Hello World";
s[6] = 'x'; // পজিশন ৬ এ লেখার চেষ্টা
printf("%s", s);
return 0;
}
আউটপুট
Segmentation Fault
স্ট্রিং লিটারেল রিড-অনলি মেমরি সেকশনে (.rodata/.text) থাকে। সেটি লিখতে চাইলে প্রোগ্রাম ক্র্যাশ করে।
সঠিক ব্যবহার
char s[] = "Hello";— যখন স্ট্রিং মডিফাই করতে হবেconst char *s = "Hello";— শুধু পড়ার জন্য (সेफ्टी বাড়াতেconstব্যবহার করুন)char *s = malloc(...);— ডাইনামিক্যালি অ্যালোকেট করা স্ট্রিং (পরেfreeকরতে হবে)