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
相关产品推荐
相关产品推荐

