malloc()是否将已分配的数组初始化为零?

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)

在您的程序中,您已尝试访问内存块的内容,该内容块被调用未定义的行为.


hac*_*cks 7

malloc不应该将分配的内存初始化为零.

分配的内存malloc未初始化.这些地方的价值是不确定的.在这种情况下,如果该位置的值是该类型的陷阱表示,则访问该内存可能会导致未定义的行为.

n1570-§6.2.6.1(p5):

某些对象表示不需要表示对象类型的值.如果对象的存储值具有这样的表示并且由不具有字符类型的左值表达式读取,则行为是未定义的.[...]

和脚注说:

因此,可以将自动变量初始化为陷阱表示而不会导致未定义的行为,但是在其中存储适当的值之前,不能使用该变量的值.

如果行为未定义,则无法预期.您可能会或可能不会得到预期的结果.


axi*_*iac 7

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 不再需要该转换。

  • @RyanB。- GCC 在这里不符合 C 标准。`void*` 可以隐式转换为所有对象类型。不需要演员表。 (3认同)
  • GCC 文档:_在赋值运算符以外的上下文中需要强制转换_。 (2认同)

Rya*_* B. 6

来自 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,否则设置为随机。我不知道其他编译器,但你明白了。

  • 您能否详细说明一下*“在现代版本的 GCC 中,如果不启用代码优化,则设置为 0x000000,否则设置为随机。”*?可能包括参考吗? (2认同)