【发布时间】:2011-06-25 21:37:08
【问题描述】:
我不明白下面的代码是如何分配内存的:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]={"text"};
char b[]={'t','e','x','t'};
printf(":%s: sizeof(a)=%d, strlen(a)=%d\n",a, sizeof(a), strlen(a));
printf(":%s: sizeof(b)=%d, strlen(b)=%d\n",b, sizeof(b), strlen(b));
return 0;
}
输出是
:text: sizeof(a)=5, strlen(a)=4
:texttext: sizeof(b)=4, strlen(b)=8
通过查看内存地址和输出代码,变量 b 似乎位于变量 a 之前,这就是 strlen(b) 通过查找 \0 返回 8 的原因。 为什么会这样?我希望首先声明变量 a。
【问题讨论】:
-
您不能保证以任何特定顺序分配内存。
a可能出现在b之前或之后,或者它们可能相距甚远。 -
是的。这就是为什么它在堆栈中更高的原因。但你真的不应该依赖这样的期望。
-
将 strlen() 与字符数组一起使用可能很危险。
-
@JustAnotherProgrammer:不会比在分配的内存上调用
strlen更危险。
标签: c string memory-management