【发布时间】:2018-04-13 20:02:18
【问题描述】:
通常假设将对象初始化为所有位 0 是将其所有成员设置为 0 的简单方法。对于非整数类型,该标准不保证这一点:
- 所有位为零可能不是指针的有效表示,甚至是空指针,尽管所有常见的现代系统都使用它。
- 所有位为零可能不是浮点数的合法表示,尽管它在 IEEE 兼容系统上。
整数呢?以下代码是否完全定义:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int *p = calloc(sizeof(*p), 1);
if (p) {
printf("%d\n", *p);
memset(p, 0, sizeof(*p));
printf("%d\n", *p);
free(p);
}
return 0;
}
【问题讨论】:
-
为什么要这样做?您是否正在寻找一种将任何内存初始化为某种“安全”值的通用方法?
-
我不明白这个问题...你知道 calloc 与 malloc+memset zero 是一回事吗?为什么要额外的 memset?
标签: c language-lawyer undefined-behavior calloc