c++ - 数组初始化之间的区别

标签 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

现在,陈述 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/

相关文章:

c++ - C++ 中的惰性/多阶段构造

c++ - 写出错误答案

无法复制字符串的一部分

c - 为什么这段代码会给出运行时错误?

c++ - 如何从 cpp 文件修改 VS_VERSION_INFO

c++ - RGB2BGR 选项从 cvtColor 中消失

c++ - PHP 的 preg_match() 等同于 C++?

c++ - O(log n) 中的广度优先搜索

c - 这个基本的 shell 程序有什么问题?前几个命令运行良好,但结果总是以段错误结束

c - ssize_t 在 Linux 中定义在哪里?