dev*_*150 7 c malloc initialization
这是我正在使用的代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int sz = 100000;
arr = (int *)malloc(sz * sizeof(int));
int i;
for (i = 0; i < sz; ++i) {
if (arr[i] != 0) {
printf("OK\n");
break;
}
}
free(arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序不打印OK.malloc不应该将分配的内存初始化为零.为什么会这样?
msc*_*msc 10
malloc的手册页说:
malloc()函数分配大小字节并返回指向已分配内存的指针.内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
因此,malloc()返回未初始化的内存,其内容是不确定的.
if (arr[i] != 0)
Run Code Online (Sandbox Code Playgroud)
在您的程序中,您已尝试访问内存块的内容,该内容块被调用未定义的行为.
malloc不应该将分配的内存初始化为零.
分配的内存malloc未初始化.这些地方的价值是不确定的.在这种情况下,如果该位置的值是该类型的陷阱表示,则访问该内存可能会导致未定义的行为.
n1570-§6.2.6.1(p5):
某些对象表示不需要表示对象类型的值.如果对象的存储值具有这样的表示并且由不具有字符类型的左值表达式读取,则行为是未定义的.[...]
和脚注说:
因此,可以将自动变量初始化为陷阱表示而不会导致未定义的行为,但是在其中存储适当的值之前,不能使用该变量的值.
如果行为未定义,则无法预期.您可能会或可能不会得到预期的结果.
malloc不应该将分配的内存初始化为零。为什么会这样?
40 多年前,它就是这样设计的。
但是,与此同时,创建了将分配的内存初始化为零的calloc()函数,这是为数组分配内存的推荐方法。
线路:
arr = (int *)malloc(sz * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
应该读:
arr = calloc(sz, sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果您从一本旧书中学习 C,它会教您始终将malloc()or calloc()(a void *)返回的值转换为您分配值的变量类型(int *在您的情况下)。这是过时的,如果返回的值malloc()或calloc()直接分配给变量,则现代版本的 C 不再需要该转换。
来自 C 标准 7.22.3.4:
概要
#include <stdlib.h>
void *malloc(size_t size);
Run Code Online (Sandbox Code Playgroud)
描述
malloc 函数为大小由 size 指定且值不确定的对象分配空间。
该值是不确定的。因此,每个编译器都可以自由地按照自己的意愿行事。例如,在 Microsoft Visual C++ 中,在Debugmode 下,分配的内存区域由malloc()全部设置为,0xCDCDCDCD并且在Releasemode 下它是随机的。在现代版本的 GCC 中,如果不启用代码优化,则设置为 0x000000,否则设置为随机。我不知道其他编译器,但你明白了。
| 归档时间: |
|
| 查看次数: |
15769 次 |
| 最近记录: |