分配int**内的int*时,前两次分配出现异常整数值问题
问题分析与修复:整数字符串解析为
int**时的异常输出 核心错误原因
你的代码出现随机异常值的根本原因是二级指针数组的内存分配大小计算错误:
在parray函数中,这一行代码:
ret = (int **)malloc(sizeof(int) * len);
ret是int**类型,数组中的每个元素都是int*指针,但你却按int的大小来分配内存。在64位系统中,int占4字节,int*占8字节,当字符串长度超过4时,分配的内存空间不足以容纳所有int*指针,后续写入操作会越界破坏内存结构,导致出现随机的异常值。
修复后的代码
修正核心错误并补充内存泄漏处理
#include <stdlib.h> int ft_strlen(char *str) { int count; count = 0; while (*str++) count++; return (count); } int **parray(char *str) { int **ret; int len; int i; len = ft_strlen(str); // 修正:按int*的大小分配len个元素的空间 ret = (int **)malloc(sizeof(int*) * len); if (ret == NULL) return (NULL); i = 0; while (i < len) { ret[i] = (int *)malloc(sizeof(int) * 2); if (ret[i] == NULL) { // 内存泄漏处理:释放已分配的子数组和二级指针数组 while (--i >= 0) free(ret[i]); free(ret); return (NULL); } ret[i][0] = str[i] - '0'; ret[i][1] = len - 1 - i; i++; } return (ret); }
优化后的测试main函数(补充内存释放)
#include <stdio.h> #include <stdlib.h> // 需包含ft_strlen和parray的定义或声明 int main() { char *str = "1255555555555555"; int len = ft_strlen(str); int** ret = parray(str); int i = 0; if (ret == NULL) { printf("内存分配失败\n"); return 1; } while (i < len) { printf("%d %d\n", ret[i][0], ret[i][1]); i++; } // 释放内存,避免泄漏 i = 0; while (i < len) { free(ret[i]); i++; } free(ret); return 0; }
验证结果
修复后运行程序,输出会符合预期:
1 15 2 14 5 13 5 12 5 11 5 10 5 9 5 8 5 7 5 6 5 5 5 4 5 3 5 2 5 1 5 0
补充说明
- 短字符串(长度≤4)看似正常是巧合:32位系统中
int和int*均为4字节,刚好匹配;64位系统中,长度≤4时分配的内存刚好能容纳前2个int*指针,后续未触发明显内存破坏,但本质仍是错误代码。 - 内存泄漏处理不可忽略:当某个子数组分配失败时,必须释放之前已分配的所有内存,避免内存资源浪费。
内容的提问来源于stack exchange,提问作者realreal
相关产品推荐
相关产品推荐

