【发布时间】:2015-04-19 16:32:03
【问题描述】:
我有一个简单的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void){
char *str = (char *) malloc(4*sizeof(char));
int i;
for(i = 0; i < 64; i ++)
printf("%d, %ld, %d, %c\n", i, (long) &(str[i]), (int) str[i], str[i]);
return 0;
}
我使用malloc() 为str 分配了一个内存,可以在str[0], ..., str[3] 中保存4 个字母。我知道malloc() 不会初始化它的内存,而calloc() 会。
此程序按顺序打印str[i] 和i,str[i] 地址,str[i] 值,str[i] 字母。 (我使用的是 64 位的 Ubuntu,因此地址是 long 类型。)
正如预期的那样,每次运行程序时地址都完全不同。但是我想知道为什么str[24]、str[25]和str[26]分别是-31、15、2,而其他值都是0,如下所示:
(请注意,没有选项 -O0 会给出相同的结果。)
内存如何具有相同的序列 (0,0,...,0,-31,15,2,0,0,...),即使只分配了该序列中的前四个 0 而其他的都已分配照顾?
【问题讨论】:
-
您明白
str[24:26]和str[4:63]远远超出您分配的范围吧?因此,您表现出未定义的行为? -
@BillLynch 我当然知道。但是每当我运行程序时, str[24:26] 总是有 -31, 15, 2 。我认为这种现象非常不正常,因为这些 str[24:26] 超出了您指出的范围。
-
malloc从操作系统获得的内存可能比您实际要求的更多,因为它本身的效率。您尚未初始化您正在查看的内存,因此它可能包含任何内容。 -
我怀疑您看到的是 malloc() 之前分配的另一块内存的标头。也许在
main()之前。