我读到,在使用字符指针声明时,首先将字符串文字存储在静态存储中,然后返回指向它的指针.但是,在char数组中使用文字时会发生同样的情况吗?

在这里,我知道"instatic"被存储在静态存储中,因为它是字符文字,然后test接收第一个字符的地址.

char *test = "instatic";

但是在这个声明中,它也使用字符文字,它们是不是首先位于静态存储中,然后被复制到堆栈中?

char test[] = "instatic?";

推荐答案

形式上,字符串文字是源代码中的文本,它是包含在"个标记中的字符序列,根据C 2018 6.4.5 1,可以 Select 编码前缀u8uUL.

在C标准中使用的抽象计算模型中,任何字符串文字,无论它如何使用,都会导致创建一个静态存储持续时间数组,该数组是根据6.4.5 6使用字符串的内容进行初始化的,包括一个终止空字符.

该静态数组可能会出现在编译器生成的实际程序中,也可能不会出现,这取决于它的使用方式以及编译器优化程序的方式.换句话说,C标准所描述的抽象程序始终包含字符串文字的静态数组,但是由C编译器生成的经过优化的实际程序可能会产生与抽象程序相同的行为,而不实际使用单独的字符串文字静态数组,根据5.1.2.3 6.

char *test = "instatic";的情况下,编译器通常必须创建静态数组,以便test可以指向它.(如果不使用test,或者可能只使用数组中的单个字符,则可能不会发生这种情况,因为编译器可能会执行一些优化,从而使整个数组变得不必要.)

如果char test[] = "instatic?";出现在文件范围内,编译器通常会生成用字符串内容定义数组test的对象代码,因此不需要单独的字符串静态array.这是一种优化形式:在抽象的计算模型中,为字符串创建一个数组,为test分配单独的内存,并将字符串的内容复制到数组中.然而,在实践中,作为程序加载过程的一部分,字符串的内容被设置为数组的初始内存内容.

如果char test[] = "instatic?";出现在块作用域中(在函数内部),编译器通常需要为字符串创建单独的静态数组,因为每次开始执行块时,编译器都必须为test数组分配内存,然后对其进行初始化.这不能成为程序加载过程的一部分,因为它必须在程序执行期间多次发生.同样,根据情况的不同,优化可能能够减少这种情况.

C++相关问答推荐

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

修改pGM使用指针填充2-D数组但不起作用

segfault在C中使用getline()函数

POSIX文件描述符位置

常数函数指针优化

需要大整数和浮点数.使用long long int和long double

不会停在空格或换行符上的错误

在传统操作系统上可以在虚拟0x0写入吗?

理解C版宏(看起来像未声明的变量?)

在C++中访问双指针

解决S随机内存分配问题,实现跨进程高效数据共享

C语言中神秘的(我认为)缓冲区溢出

GETS()在C++中重复它前面的行

与外部SPI闪存通信时是否应禁用中断?

问题:C#Define上的初始值设定项元素不是常量

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

WSASocket在哪里定义?

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

为什么需要struct in_addr

设置具有非零终止字符串的大整数