数组初始化之间的差异

Sad*_*que 3 c c++

请参阅以下声明:

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
Run Code Online (Sandbox Code Playgroud)

现在,陈述A和C之间有什么区别吗?我的意思是两个都应该在Stack上吗?只有b将位于静态位置.


那么在程序的整个生命周期中,不会使"jgkl"存在于静态位置吗?既然它应该是只读/常数?请澄清.

Hea*_*utt 5

不,因为语句A中的字符 "jgkl"用于初始化a,所以它不会在可执行文件中为字符串创建存储(除了通过声明创建的存储之外a).此声明在读写内存中创建一个包含字节的字符数组{'j','g','k','l','\0'},但用于初始化它的字符串在可执行结果中不存在.

在语句B中,字符串文字的地址用作初始化程序.该变量char *b是存储在读写存储器中的指针.它指向字符串"jhdfjnfnsfnnkjdf".此字符串存在于可执行映像中通常称为".sdata"的段中,表示"静态数据".字符串通常存储在只读存储器中,如C标准所允许的那样.

这是声明一个字符数组和一个字符串常量之间的一个关键区别:即使你有一个指向字符串常量的指针,你也不应该修改内容.

根据ANSI C标准第6.5.7节初始化,尝试修改字符串常量是"未定义的行为".