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解释了存储文字在内存中的位置:
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是指针的地址.