আমি কেন এটি পরিবর্তন করার চেষ্টা করব না?
কারণ এটি অনির্ধারিত আচরণ। C99 N1256 খসড়া 6.7.8 / 32 "সূচনা" থেকে উদ্ধৃতি :
উদাহরণ 8: ঘোষণা
char s[] = "abc", t[3] = "abc";
"প্লেইন" চর অ্যারে অবজেক্টগুলি সংজ্ঞায়িত করে s
এবং t
যার উপাদানগুলি অক্ষর স্ট্রিং ল্যাটারাল দিয়ে শুরু করা হয়।
এই ঘোষণাটি সমান
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };
অ্যারের সামগ্রীগুলি পরিবর্তনযোগ্য if অন্যদিকে, ঘোষণা
char *p = "abc";
p
"পয়েন্টার টু চর" টাইপ দিয়ে সংজ্ঞায়িত করে এবং এটি দৈর্ঘ্য 4 দিয়ে "চরের অ্যারে" টাইপযুক্ত কোনও বস্তুর দিকে নির্দেশ করতে ইনিশিয়ালাইজ করে যার উপাদানগুলি একটি অক্ষর স্ট্রিং আক্ষরিক দিয়ে প্রাথমিক হয়। p
অ্যারের বিষয়বস্তুগুলি সংশোধন করার জন্য যদি চেষ্টা করা হয় , তবে আচরণটি সংজ্ঞায়িত।
যেখানে তারা যেতে না?
জিসিসি 4.8 x86-64 ইএলএফ উবুন্টু 14.04:
char s[]
: স্ট্যাক
char *s
:
.rodata
অবজেক্ট ফাইলের বিভাগ
- একই বিভাগ যেখানে
.text
অবজেক্ট ফাইলের বিভাগটি ডাম্প হয়ে যায়, এতে রড এবং এক্সিকিউট অনুমতি রয়েছে তবে লিখুন না
কার্যক্রম:
#include <stdio.h>
int main() {
char *s = "abc";
printf("%s\n", s);
return 0;
}
সংকলন এবং পচনশীল:
gcc -ggdb -std=c99 -c main.c
objdump -Sr main.o
আউটপুট রয়েছে:
char *s = "abc";
8: 48 c7 45 f8 00 00 00 movq $0x0,-0x8(%rbp)
f: 00
c: R_X86_64_32S .rodata
সুতরাং স্ট্রিংটি .rodata
বিভাগে সঞ্চিত আছে ।
তারপর:
readelf -l a.out
রয়েছে (সরলীকৃত):
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000704 0x0000000000000704 R E 200000
Section to Segment mapping:
Segment Sections...
02 .text .rodata
এর অর্থ এই যে ডিফল্ট linker স্ক্রিপ্ট উভয় ডাম্প .text
এবং .rodata
একটি সেগমেন্ট যে মৃত্যুদন্ড কার্যকর করা যেতে পারে কিন্তু পরিবর্তন করা মধ্যে ( Flags = R E
)। এই জাতীয় বিভাগটি সংশোধন করার চেষ্টা করা লিনাক্সে সেগফল্টের দিকে নিয়ে যায়।
আমরা যদি এর জন্য একই করি char[]
:
char s[] = "abc";
আমরা প্রাপ্ত:
17: c7 45 f0 61 62 63 00 movl $0x636261,-0x10(%rbp)
সুতরাং এটি স্ট্যাকের মধ্যে (তুলনামূলক %rbp
) সঞ্চিত হয়ে যায় এবং আমরা অবশ্যই এটি সংশোধন করতে পারি।