मुझे इसे बदलने की कोशिश क्यों नहीं करनी चाहिए?
क्योंकि यह अपरिभाषित व्यवहार है। 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
), और हम निश्चित रूप से इसे संशोधित कर सकते हैं।