我读过;


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/

10-11 23:11
查看更多