首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当字符数组从字符串文字初始化时会发生什么?

当字符数组从字符串文字初始化时会发生什么?
EN

Stack Overflow用户
提问于 2018-06-20 06:59:10
回答 2查看 1.1K关注 0票数 5

据我所知,下面的代码是这样工作的:

代码语言:javascript
复制
char* cptr = "Hello World";

"Hello World“位于程序内存的.rodata部分。字符串字面量"Hello World"返回一个指针,指向字符串的基地址,或者所谓的“数组”中第一个元素的地址,因为字符在内存中是按顺序排列的,所以它应该是“H”。这是我的小图,当我想象字符串文字存储在内存中时:

代码语言:javascript
复制
0x4 : 'H'
0x5 : 'e'
0x6 : 'l'
0x6 : 'l'
0x7 : 'o'
0x8 : ' '
0x9 : 'W'
0xa : 'o'
0xb : 'r'
0xc : 'l'
0xd : 'd'
0xe : '\0'

所以上面的声明变成了:

代码语言:javascript
复制
char* cptr = 0x4;

现在cptr指向字符串文字。我只是在编造地址。

代码语言:javascript
复制
0xa1 : 0x4

现在,这段代码是如何工作的?

代码语言:javascript
复制
char cString[] = "Hello World";

我假设和前面的情况一样,"Hello World"也会降级为'H‘和0x4的地址。

代码语言:javascript
复制
char cString[] = 0x4;

=与字符数组的初始化一起使用时,我将其作为重载赋值操作符进行读取。据我所知,仅在初始化C-string时,它会从给定的基址开始逐个字符地复制到C-string中,直到它达到'\0‘作为最后复制的字符。它还为所有字符分配了足够的内存。因为重载操作符实际上只是函数,所以我假设它的内部实现类似于strcpy()

我想找一位更有经验的C程序员来证实我对这段代码如何工作的假设。这是我将字符串文字中的字符复制到C-string中后的可视化结果:

代码语言:javascript
复制
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指针来临时保存字符串文字的基地址,并使用相同的字符指针(字符串文字的基地址)来初始化C-string。

代码语言:javascript
复制
char* cptr = "Hello World";
char cString[] = cptr;

我假设"Hello World"的计算结果是它的基地址0x4。所以这段代码应该是这样的:

代码语言:javascript
复制
char* cptr = 0x4;
char cString[] = 0x4;

我假设它应该与char cString[] = "Hello World";没有什么不同,因为"Hello World“的计算结果是它的基地址,而这就是存储在字符指针中的地址!

然而,gcc给了我一个错误:

代码语言:javascript
复制
error: invalid initializer
char cString[] = cptr;
                 ^

  1. 为什么不能使用字符指针作为临时占位符来存储字符串的基址?
  2. 这段代码是怎么工作的?我的假设是在代码中使用字符串字面量将基址返回到“correct?
  3. Does”,其中字符存储在内存中吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 07:09:59

您对内存布局的理解或多或少是正确的。但是您遇到的问题是C中的初始化语义之一。

此处声明中的=符号不是赋值运算符。相反,它是为被实例化的变量指定初始值设定项的语法。在一般情况下,T x = y;T x; x = y;不同。

有一个语言规则,字符数组可以从字符串文字初始化。(在此上下文中,字符串文字不是“计算为其基地址”)。有一种语言规则,即数组可以从指向要复制到数组中的元素的指针进行初始化。

为什么规则是这样的?“历史原因”。

票数 6
EN

Stack Overflow用户

发布于 2018-06-20 07:23:01

第二个定义char cString[] = "Hello World";是这个等价定义的简写:

代码语言:javascript
复制
char cString[12] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0' };

如果此定义作为全局作用域或static存储出现,则cString将与可执行映像中的初始内容一起位于.data段中。如果它出现在具有自动存储的函数范围内,编译器将为数组分配自动存储(保留堆栈帧或等效物上的空间),并生成代码以在运行时执行初始化。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50938018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档