请看以下声明:
char a[5]="jgkl"; // let's call this Statement A
char *b="jhdfjnfnsfnnkjdf"; // let's call this Statement B , and yes i know this is not an Array
char c[5]={'j','g','k','l','\0'}; // let's call this Statement C
现在,陈述 A 和陈述 C 之间有什么区别吗? 我的意思是两者都应该在 Stack 上,不是吗?只有 b 会在静态位置。
那么这不会让“jgkl”在程序的整个生命周期中都存在于静态位置吗?因为它应该是只读/常量? 请澄清。
最佳答案
不,因为语句 A 中的字符“jgkl”用于初始化a
,它不会在可执行文件中为字符串创建存储(除了您通过声明 a
创建的存储)。此声明在读写内存中创建一个字符数组,其中包含字节 {'j','g','k','l','\0'}
,但字符串用于初始化它否则不会出现在可执行结果中。
在语句 B 中,字符串文字的地址 用作初始值设定项。变量 char *b
是一个存储在读写内存中的指针。它指向字符串"jhdfjnfnsfnnkjdf"
。该字符串存在于您的可执行镜像中通常称为“.sdata”的段中,意思是“静态数据”。字符串通常存储在只读内存中,这是 C 标准所允许的。
这是声明字符数组和字符串常量之间的一个关键区别:即使您有一个指向字符串常量的指针,您也不应该修改其内容。
根据有关初始化的 ANSI C 标准第 6.5.7 节,尝试修改字符串常量是“未定义行为”。
关于c++ - 数组初始化之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427750/