char*string ="你好"; 内存地址空间

Chi*_*ick 0 c memory linker operating-system

这个板子似乎充满了这些类型的问题,我确实经历了其中的一些问题,但我仍然对这两者之间的区别感到困惑:

char string[] = "Hello"; 
char * string2 = "hello";
Run Code Online (Sandbox Code Playgroud)

现在,

char string[] = "Hello"; 
Run Code Online (Sandbox Code Playgroud)

...是一个数组,分配了6个连续的存储器地址空间,用于存储字符,最后包括\ 0.

&p%p显示内存地址0x7fffbcabce90.%P字符串示出了相同存储器地址0x7fffbcabce90.%P字符串[1]示出了0x7fffbcabce90 + typeof运算(炭),所以0x7fffbcabce91.等等

char * string2 = "hello";
Run Code Online (Sandbox Code Playgroud)

...是指向char类型的指针,它指向字符串第一个字符的内存地址(h).

%P&字符串2示出存储器地址0x7fffbcabce88.%P字符串2示出0x400ca8的不同的存储器地址.%P字符串2 [1]示出了0x400ca8 +的sizeof(char)的,所以0x400ca9.

我的问题是:这个内存地址范围什么(0x400000)?这是我无法修改字符串字符的原因吗?:

string[1] = 'c';   //that works
string2[1] = 'c';  //not working
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:拼写错误(%string2 =>&string2)

Edit2:正如我所解释的那样,关键字是字符串文字.

char * string2[] = "Hello"; 
Run Code Online (Sandbox Code Playgroud)

...是指向字符串文字的指针.这是一个线索,其中R Samuel Klatchko解释了存储文字在内存中的位置:

字符串文字:它们去哪儿了?

Dav*_*nan 6

char string[] = "Hello"; 
Run Code Online (Sandbox Code Playgroud)

声明一个以null结尾的数组char并初始化它以包含它"Hello\0".

char * string2 = "hello";
Run Code Online (Sandbox Code Playgroud)

声明指向char并初始化它以指向字符串文字.

修改字符串文字会调用未定义的行为.编译器将字符串文字放在只读内存中是很常见的,看起来这就是编译器正在做的事情.并非所有编译器都会这样做 - 关键是修改字符串文字会调用未定义的行为.

通过查看程序中指针的实际值,几乎无法获得.只读地址接近,0x00400000因为我认为,您在Windows上运行,这是可执行模块的默认加载地址.但没有人说模块必须在那里加载.图书馆不会.


我们来看看:

printf("%p %p %p %p", string1, &string1, string2, &string2);
Run Code Online (Sandbox Code Playgroud)

在这个表达式中,string1衰减为指针,因此给出相同的输出&string1.并且string2是一个指针,并且&string2是指针的地址.