【发布时间】:2013-07-14 11:46:55
【问题描述】:
我开始学习 C 中的动态内存分配,到目前为止,我读过的所有地方 malloc() 函数都不会初始化新分配块的值。
这在 C 的较新版本中是否已更改? C99 和 C11?
我正在使用 Xcode 执行以下操作,并且所有值都被初始化为 0。
double *p = (double *) malloc(5 * sizeof(double));
printf("Address of p0 = %p | Valoe of p0 = %f\n", p, *p);
printf("Address of p1 = %p | Valoe of p1 = %f\n", p+1, *(p+1));
printf("Address of p2 = %p | Valoe of p2 = %f\n", p+2, *(p+2));
printf("Address of p3 = %p | Valoe of p3 = %f\n", p+3, *(p+3));
printf("Address of p4 = %p | Valoe of p4 = %f\n", p+4, *(p+4));
我认为这仅适用于函数 calloc()。
【问题讨论】:
-
我认为这是因为您分配的内存之前没有被其他非零变量使用。你不能确定它总是如此。
-
似乎是未定义的行为。再重复几次,检查你是否仍然得到 0。
-
如果你想要一个零初始化区域,只需使用
calloc。 -
在多用户操作系统上,当操作系统给你一个新的内存页面时,它必须是“干净的”,这样你就看不到任何你不应该看到的东西。实现此目的的一种简单方法是为您提供一个充满零的页面。
-
您只进行了 1 个 malloc 调用。您的操作系统(不是“malloc”)通常会分发清零的新内存,以免从之前使用该内存的其他进程泄漏信息。我建议你做一些 malloc,用一些东西填充内存,free() 它,然后再 malloc()。由于重复使用相同的内存,因此您获得旧东西的机会更大。
标签: c dynamic-allocation