C语言中使用malloc分配结构体后,其内部数组元素是否有默认值?
问题解答
先给你梳理两个关键点,一个是代码里的内存分配错误,另一个是你问的数组默认值问题:
1. 先纠正malloc的错误写法
你写的obj = malloc(sizeof(obj));这里踩了个常见的坑:obj是Object*类型的指针,sizeof(obj)拿到的是指针本身的大小(64位系统下是8字节,32位是4字节),但你的Object结构体实际大小是10字节(因为BLOCK是char[10],结构体里就这一个成员)。这么分配内存的话,空间根本不够用,后续访问obj->block数组肯定会越界,触发未定义行为。
正确的写法应该用sizeof(Object)或者sizeof(*obj)来获取结构体的实际大小,后者更安全——就算以后obj的类型改了,这行代码也不用跟着改:
obj = malloc(sizeof(Object)); // 更推荐的写法 obj = malloc(sizeof(*obj));
2. block数组有没有默认值?
答案是没有。不管malloc分配的内存大小对不对,malloc分配的内存都是未初始化的,obj->block里的每个char元素存的都是内存里原来的随机垃圾数据,没有任何默认值。
如果想让数组元素有确定的初始值(比如全0),可以这么做:
- 用
calloc代替malloc,calloc会自动把分配的内存全部初始化为0:obj = calloc(1, sizeof(*obj)); - 或者用
malloc分配后,手动调用memset来初始化:obj = malloc(sizeof(*obj)); if (obj != NULL) { // 别忘了检查malloc是否成功分配到内存 memset(obj->block, 0, sizeof(obj->block)); }
额外提一句:如果是在栈上定义的局部变量Object obj;,它的block数组同样是未初始化的,内容也是垃圾;但如果是静态变量static Object obj;,数组元素会被默认初始化为0。
内容的提问来源于stack exchange,提问作者Spn
相关产品推荐
相关产品推荐

