据我理解,下面的代码起到以下作用:
"
因此,上面的声明变为:
现在cptr指向字符串文字。我只是编造地址。
现在我们来看一下这段代码是如何工作的?
我将“=”翻译为重载赋值运算符,当它与char数组的初始化一起使用时。我理解,仅在C字符串初始化时,它会从给定基地址开始逐个复制字符到C字符串,直到复制最后一个字符'\0'为止。它还为所有字符分配足够的内存。由于重载运算符实际上只是函数,我认为它的内部实现类似于strcpy()。
我希望有经验的C程序员能确认我的代码如何工作的假设。这是我将字符串文字中的字符复制到C字符串后对C字符串的可视化:
我假设
我认为这应该与
char* cptr = "Hello World";
"
\"Hello World\" 存储在程序内存的 .rodata
部分。字符串字面量\"Hello World\"
返回一个指向该字符串基地址的指针,或者所谓“数组”的第一个元素的地址,因为字符在内存中是按顺序排列的,所以它将是 'H'。这是我想象中字符串字面量存储在内存中的小图示:
0x4 : 'H'
0x5 : 'e'
0x6 : 'l'
0x6 : 'l'
0x7 : 'o'
0x8 : ' '
0x9 : 'W'
0xa : 'o'
0xb : 'r'
0xc : 'l'
0xd : 'd'
0xe : '\0'
因此,上面的声明变为:
char* cptr = 0x4;
现在cptr指向字符串文字。我只是编造地址。
0xa1 : 0x4
现在我们来看一下这段代码是如何工作的?
char cString[] = "Hello World";
我假设在之前的情况下,"Hello World"
也会退化成 'H' 和 0x4 的地址。
char cString[] = 0x4;
我将“=”翻译为重载赋值运算符,当它与char数组的初始化一起使用时。我理解,仅在C字符串初始化时,它会从给定基地址开始逐个复制字符到C字符串,直到复制最后一个字符'\0'为止。它还为所有字符分配足够的内存。由于重载运算符实际上只是函数,我认为它的内部实现类似于strcpy()。
我希望有经验的C程序员能确认我的代码如何工作的假设。这是我将字符串文字中的字符复制到C字符串后对C字符串的可视化:
0xb4 : 'H'
0xb5 : 'e'
0xb6 : 'l'
0xb6 : 'l'
0xb7 : 'o'
0xb8 : ' '
0xb9 : 'W'
0xba : 'o'
0xbb : 'r'
0xbc : 'l'
0xbd : 'd'
0xbe : '\0'
再次强调,地址是任意的,重点是堆栈中的C字符串与内存中.rodata
部分中的字符串字面量不同。
我想做什么?我试图使用char指针暂时保存字符串字面量的基地址,并使用相同的char指针(字符串字面量的基地址)来初始化C字符串。
char* cptr = "Hello World";
char cString[] = cptr;
我假设
"Hello World"
会被评估为它的基础地址0x4
。因此,这段代码应该是这样的:char* cptr = 0x4;
char cString[] = 0x4;
我认为这应该与
char cString[] = "Hello World";
没有区别,因为"Hello World"会被解释为其基础地址,并且这就是存储在char指针中的内容!但是,gcc却给了我一个错误:error: invalid initializer
char cString[] = cptr;
^
- 为什么不能使用char指针作为临时占位符来存储字符串字面值的基地址?
- 这段代码如何工作?我的假设正确吗?
- 在代码中使用字符串字面值会将存储在内存中的字符的“数组”基地址返回吗?
char cString[] = "Hello World"
不涉及任何指针——符号cString
最终成为一个由“Hello World”中的字符初始化的包含12个字符的数组的地址。 - Steve Summit