什么时候分配字符串的地址?
When is the address of a string allocated?
#include<stdio.h>
int main()
{
char str[10];
printf("The address of string is %x", str);
return;
}
每次我运行程序,都会出现相同的内存地址。为什么?
什么时候分配内存?
首先,您的程序导致undefined behavior。
您必须使用 %p
打印指针。此外,FWIW,如果提供的参数不是字符指针,则必须将其转换为 void *
.
也就是说,内存分配取决于实现。 C 标准对地址范围分配方案没有强制要求。
由于您的 str
具有 函数范围 并且没有存储 class 说明符,因此它具有 自动存储持续时间 默认。这意味着只要执行不离开其范围(main()
函数),它就存在。所以你的问题的答案是:每当输入 main()
时,实现必须为这个变量保留内存。但是实现仍然可以更早地执行它,因为这不会导致不同的可观察行为。
至于您的其他问题,C 的规范中没有任何内容 告诉您有关地址的任何信息。很可能,您的实现使用 调用堆栈 来存储本地(自动)变量,并且在您的系统中,此调用堆栈始终位于相同的虚拟地址。但这是猜测,一个实现可以为所欲为。
#include<stdio.h>
int main()
{
char str[10];
printf("The address of string is %x", str);
return;
}
每次我运行程序,都会出现相同的内存地址。为什么? 什么时候分配内存?
首先,您的程序导致undefined behavior。
您必须使用 %p
打印指针。此外,FWIW,如果提供的参数不是字符指针,则必须将其转换为 void *
.
也就是说,内存分配取决于实现。 C 标准对地址范围分配方案没有强制要求。
由于您的 str
具有 函数范围 并且没有存储 class 说明符,因此它具有 自动存储持续时间 默认。这意味着只要执行不离开其范围(main()
函数),它就存在。所以你的问题的答案是:每当输入 main()
时,实现必须为这个变量保留内存。但是实现仍然可以更早地执行它,因为这不会导致不同的可观察行为。
至于您的其他问题,C 的规范中没有任何内容 告诉您有关地址的任何信息。很可能,您的实现使用 调用堆栈 来存储本地(自动)变量,并且在您的系统中,此调用堆栈始终位于相同的虚拟地址。但这是猜测,一个实现可以为所欲为。