我读过;
int *p = (int []){3, 0, 3, 4, 1};
其实我想知道,这个数组是否会存储在内存中,因为它没有名称?
换句话说,如果
char* str = "hello"
字符串
"hello"
将存储在内存中的何处? 最佳答案
C 2011(N1570)6.5.2.5 5说:
因此,您显示的复合文字具有自动存储时间。 C标准未指定此类对象在内存中的位置。由C实现来组织内存。通常,具有自动存储期限的对象是在堆栈上创建的,但是实现还可以通过其他方法来管理此类对象。
特别是,假设您在其他地方记录了p
的值,然后递归调用包含此复合文字的例程。当例程再次初始化p
时,复合文字有第二个实例。它们实际上是不同的对象,并且C标准要求其地址不同。因此,如果您打印两个指针,它们将具有不同的值。但是,如果优化器能够确定您不执行此操作,并且永远不会比较指向复合文字不同实例的两个指针,并且没有其他可观察到的行为(由C标准定义)可以区分它们,则C实现可以自由使用复合文字的一个实际实例,而不必每次都创建一个新实例。在这种情况下,编译器可以将复合文字保留在数据节中,而不是在堆栈中。
下面的代码演示了相同复合文字的两个实例具有不同的地址:
#include <math.h>
#include <stdio.h>
void foo(int *q)
{
int *p = (int []) { 2, 3 };
if (!q)
foo(p);
else
printf("p = %p, q = %p.\n", (void *) p, (void *) q);
}
int main(void)
{
foo(0);
return 0;
}
字符串文字不同。 C 2011(N1570)6.4.5 6说:
因此,字符串文字表示具有静态存储持续时间的对象。即使包含它的例程被递归调用,也只有一个实例。
关于c - 复合/字符串文字存储在内存中的什么位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17890301/