मुझे इसे बदलने की कोशिश क्यों नहीं करनी चाहिए?
क्योंकि यह अपरिभाषित व्यवहार है। 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' };
सरणियों की सामग्री परिवर्तनीय हैं। दूसरी ओर, घोषणा
char *p = "abc";
pप्रकार "पॉइंटर टू चार्" के साथ परिभाषित करता है और इसे एक ऑब्जेक्ट के साथ इंगित करने के लिए टाइप करता है "वर्ण का प्रकार" लंबाई 4 के साथ जिसका तत्व एक चरित्र स्ट्रिंग शाब्दिक के साथ आरम्भ किया गया है। यदि pसरणी की सामग्री को संशोधित करने के लिए उपयोग करने का प्रयास किया जाता है , तो व्यवहार अपरिभाषित है।
वह कहाँ जा रहे है?
GCC 4.8 x86-64 ELF Ubuntu 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
इसका मतलब यह है कि डिफ़ॉल्ट लिंकर स्क्रिप्ट दोनों को डंप कर देती है .textऔर .rodataएक ऐसे खंड में जिसे निष्पादित किया जा सकता है लेकिन संशोधित नहीं किया जाता है ( Flags = R E)। इस तरह के सेगमेंट को संशोधित करने का प्रयास करने से लिनक्स में सेगफॉल्ट होता है।
यदि हम ऐसा ही करते हैं char[]:
char s[] = "abc";
हमने प्राप्त किया:
17: c7 45 f0 61 62 63 00 movl $0x636261,-0x10(%rbp)
तो यह स्टैक में संग्रहीत हो जाता है (सापेक्ष %rbp), और हम निश्चित रूप से इसे संशोधित कर सकते हैं।