提问人: 提问时间:6/14/2022 最后编辑:Vlad from Moscow 更新时间:6/14/2022 访问量:133
malloc(sizeof(x)) 是否使用 x 初始化分配的内存?
Does malloc(sizeof(x)) initialise the allocated memory with x?
问:
是否自动与 ?tmp = malloc(sizeof(x));
tmp = malloc(sizeof(x)); *tmp = x;
更具体地说,malloc 是立即初始化我的变量,还是只是分配内存而我必须自己初始化它?
答:
4赞
ikegami
6/14/2022
#1
不。
malloc 返回的内存未初始化。
引用 cppreference,
为未初始化的存储分配大小的字节数。
4赞
ShadowRanger
6/14/2022
#2
不。即使未定义为未初始化的存储,也与 的运行时值无关(这只是查找变量基础类型大小的友好方法)。在您提供的代码中,运行时根本没有使用 的值。malloc
sizeof(x)
x
x
0赞
JakobS.
6/14/2022
#3
不,该函数只是在堆上分配内存。它不会初始化指针。malloc()
评论
2赞
Ted Lyngmo
6/14/2022
“On the heap”听起来像是一个实现细节,可能会有所不同,尽管在大多数情况下可能是正确的。
2赞
Vlad from Moscow
6/14/2022
#4
运算符生成其操作数的大小(以字节为单位)。sizeof
也就是说,例如,如果标识符表示该类型的变量的名称,则表达式将生成该值,前提是编译器为该类型的对象保留字节。x
int
sizeof( x )
4
int
4
所以这个电话
tmp = malloc(sizeof(x));
将等同于调用
tmp = malloc(sizeof(int));
这反过来又相当于
tmp = malloc( 4 );
此语句只是尝试动态分配字节。分配的内存未初始化。4
此外,表达式 sizeof( x ) if 不是可变长度数组,在程序开始执行之前在编译时计算。x
您可以通过以下方式用零初始化它
tmp = calloc( 1, sizeof( x ) );
评论
tmp = x
*tmp = x
x
ptr = malloc(sizeof ptr[0] * n);
calloc