C语言:结构体与指针——未分配内存为何仍能运行?
为什么未分配内存,结构体里的指针数组还能“正常”运行?
这完全是巧合,属于C语言里的「未定义行为」,绝对不可行,也绝对不能这么写。
问题本质
你结构体里的int *age和int *year都是未初始化的指针——它们在栈上被创建时,会随机继承栈里的垃圾值,指向内存中某个完全未知的地址。
你往这些地址写数据,本质是在篡改不属于你程序的内存区域:
- 刚好这个区域暂时没被系统或其他变量占用,程序就没崩溃,甚至还能读出你写的内容;
- 但只要这个地址被其他数据、系统结构占用,你的写操作会直接触发段错误(程序崩溃),或者悄悄修改了其他变量的值,引发根本查不到原因的诡异bug。
正确的做法
必须手动用malloc/calloc给指针分配足够的内存,用完还要记得释放,避免内存泄漏:
#include <stdlib.h> #include <stdio.h> struct foo { int *age; }; struct bar { int *year; }; struct comb { struct foo f; struct bar b; }; int main() { struct comb c; // 分配能存5个int的内存,calloc会把内存初始化为0 c.f.age = calloc(5, sizeof(int)); c.b.year = calloc(5, sizeof(int)); // 一定要检查内存分配是否成功,避免空指针操作 if (c.f.age == NULL || c.b.year == NULL) { perror("内存分配失败"); return 1; } c.f.age[0] = 23; c.f.age[1] = 67; c.f.age[2] = 14; c.f.age[3] = 1; c.f.age[4] = 3; c.b.year[0] = 1972; c.b.year[1] = 1982; c.b.year[2] = 1988; c.b.year[3] = 1997; c.b.year[4] = 2002; int i = 0; while (i < 5) { printf("%d %d\n", c.f.age[i], c.b.year[i]); i++; } // 释放已分配的内存 free(c.f.age); free(c.b.year); return 0; }
总结
C语言不会自动为指针分配内存,未初始化的指针指向的是随机地址,这种情况下的“正常运行”只是运气好,属于绝对要避免的错误写法。动态内存必须手动分配、检查、释放,才能保证程序的稳定性。
内容的提问来源于stack exchange,提问作者rudolf_007
相关产品推荐
相关产品推荐

