gpt4 book ai didi

c - 为什么当我使用 `malloc()` 时,数据模式会出现在内存中?

转载 作者:行者123 更新时间:2023-11-30 20:38:16 25 4
gpt4 key购买 nike

我有一个简单的代码:

#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],其中包含 istr[i] 的地址、str[i] 的值str[i] 的字母,按顺序排列。 (我使用64位Ubuntu,因此地址是long类型。)

正如预期的那样,每次运行程序时,地址都有很大不同。但我想知道为什么 str[24]str[25]str[26] 分别是 -31、15、2 ,其他值均为 0,如下所示:

Ubuntu 12.04.5

(请注意,没有选项 -O0 会产生相同的结果。)

内存如何具有相同的序列(0,0,...,0,-31,15,2,0,0,...),即使该序列中仅分配了前四个 0 而其他则已分配护理?

最佳答案

正如您刚刚指出的,malloc() 不会初始化内存(顺便说一下,即使会初始化,也是从 str[4*sizeof(char )]它不会被初始化,因为它已经超出了范围)。

这意味着您打印出之前位于该内存位置的数据。这是未定义的行为,因此严格不可预测。

您看到相同值的事实可能是巧合。但如果可重复,并且始终使用相同的值,它很可能会跟踪操作系统和标准库在将控制权交给 main() 之前初始化进程环境的行为。

有一个related SO question关于堆栈上未初始化的变量。统一数据访问剩余值的原理与此类似,只是它位于堆上。

这里有一个实验:一个小程序,试图向您展示可能发生的事情(注意:它依赖于实现):

int main() {
int i;
// first part ================
char *p=(char*)malloc(100); // allocate a region in memory
for (i=0; i<100; i++) // initialize it to 0
p[i]=0;
strcpy (p+10, "Christophe"); // put some value womewhere in the middle
free(p); // release memory

// second part ============
char *q= (char*)malloc(100); // innocently allocate new memory
// and display its content
printf ("%ld==%ld ? %c%c%c\n", (long) p, (long)q, q[10],q[11], q[12]);

return 0;
}

所以你可以想象像这段代码的第一部分这样的东西可以在标准库的初始化序列期间运行(可能是在程序启动时,或者你第一次调用malloc())。

这里a live demo这段代码。

关于c - 为什么当我使用 `malloc()` 时,数据模式会出现在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com