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

C语言中如何释放指向整数数组的指针?代码相关问题咨询

解决指向整数数组的指针释放问题

首先得指出你代码里的核心问题:指针类型与内存分配的逻辑不匹配,这会导致包括释放在内的后续操作出现未定义行为。咱们一步步理清楚:

先看你代码里的错误点

你声明的int (*gameInfo)[2];是一个指向包含2个int元素的数组的指针(也就是数组指针),它指向的每个单元都是长度为2的int数组。但你初始化的步骤错了:

  • 强制转换的类型不对:应该转换成int (*)[2]而非(int *)
  • 分配的内存大小错误:你需要为size个长度为2的int数组分配空间,正确的大小应该是size * sizeof(int[2]),或者更安全的写法size * sizeof(*gameInfo)(*gameInfo本身就是一个长度为2的int数组,用sizeof能自动计算正确大小)

修正后的初始化代码

int (*gameInfo)[2]; // [0] 犯规次数 || [1] 球员数量
// 正确的分配:匹配指针类型,计算准确的内存空间
gameInfo = malloc(size * sizeof(*gameInfo));
// 也可以写成:gameInfo = (int (*)[2])malloc(size * sizeof(int[2]));
if (gameInfo == NULL) {
    // 别忘了检查malloc是否成功,避免空指针操作
    perror("malloc failed");
    exit(EXIT_FAILURE);
}
for (int i = 0; i < size; i++) {
    memset(gameInfo[i], 0, 2 * sizeof(int));
}

正确的释放方式

因为你是用malloc一次性分配了整块内存,每个gameInfo[i]只是整块内存里的一段连续空间,并不是单独malloc出来的指针,所以直接释放根指针即可:

free(gameInfo);
gameInfo = NULL; // 建议释放后置空,避免野指针问题

为什么原代码会导致释放异常?

原代码分配的是size个int*的大小,而非size个int[2]的大小,空间要么不足要么冗余。再加上指针类型不匹配,gameInfo[i]的地址偏移计算会出错(数组指针的步长是sizeof(int[2]),而int*的步长是sizeof(int)),这会导致内存越界访问,后续释放时自然会触发错误。

内容的提问来源于stack exchange,提问作者Bruno Teixeira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:21:21