何时分配了字符串的地址?

时间:2017-08-28 10:24:08

标签: c memory-address

#include<stdio.h>
int main()
{
    char str[10];
    printf("The address of string is %x", str);
    return;
}

每次运行程序时,都会显示相同的内存地址。为什么会这样? 什么时候分配内存?

2 个答案:

答案 0 :(得分:0)

首先,您的计划会导致undefined behavior

您必须使用%p来打印指针。另外,FWIW,如果提供的参数不是字符指针,则必须将其转换为void *

也就是说,内存分配取决于实现。 C标准没有规定任何有关地址范围分配方案的内容。

答案 1 :(得分:0)

由于您的str具有功能范围且没有存储类说明符,因此默认情况下它具有自动存储持续时间。这意味着只要执行不离开其范围(main()函数),它就存在。因此,您的问题的答案是:每当输入main()时,实现必须为此变量保留内存。但是实施仍然可以提前做到,因为这不会导致不同的可观察行为。

至于你的另一个问题,C的规范中有 nothing 告诉你关于地址的任何信息。最有可能的是,您的实现使用调用堆栈来存储本地(自动)变量,并且在您的系统中,此调用堆栈始终位于同一虚拟地址。但这是猜测,实现可以做任何事情。