You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 21:07:27