C语言中使用malloc创建多数组初始化后输出异常问题求助
问题根源与解决方案
你的代码核心错误是误解了C语言指针算术的工作机制:指针的加减操作是基于其指向的数据类型大小自动偏移的,不需要手动乘以sizeof(int)。所有指针偏移操作都多乘了类型大小,导致内存越界,触发未定义行为,最终出现随机值。
具体错误分析与修正
1. 初始化循环的错误
原代码中arr1 += sizeof(int)是错误的:假设sizeof(int)为4,int指针每次加1就会自动偏移4字节(一个int的大小),而你加4的话,指针会直接跳4个int的位置(16字节),远超过了malloc(5*sizeof(int))分配的20字节空间。第一次循环后指针就越界了,后续赋值都写到了不属于数组的内存区域,同时指针位置被彻底打乱。
修正后的初始化循环:
for(int j = 0; j< 5 ; j++){ *arr1 = 10; *arr2 = 10; *arr3 = 10; arr1++; // 每次偏移一个int的大小,等价于 arr1 += 1 arr2++; arr3++; }
2. 指针重置的错误
原代码arr1 -= (sizeof(int)*5)是错误的:因为初始化循环里每次指针加了sizeof(int),现在想回到初始位置的计算完全错误。如果用修正后的初始化循环(每次加1),只需要减去循环次数5即可回到malloc返回的初始地址。
修正后的指针重置代码:
arr1 -= 5; arr2 -= 5; arr3 -= 5;
3. 打印循环的错误
原打印循环一开始就执行arr1 += sizeof(int),不仅偏移错误,还直接跳过了数组的第一个元素。同样需要把偏移改为加1,并且调整打印和偏移的顺序(先打印当前元素,再偏移指针)。
修正后的打印循环:
for(int k = 0; k < 5; k++){ printf("arr1 %d\n", *arr1); printf("arr2 %d\n", *arr2); printf("arr3 %d\n", *arr3); arr1++; arr2++; arr3++; }
额外建议
- 尽量不要修改malloc返回的原始指针,最好用临时指针来遍历数组,避免丢失初始地址导致内存泄漏。比如:
int *temp = arr1; for(int j=0;j<5;j++){ *temp =10; temp++; } // 这样arr1始终指向初始地址,不需要重置
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

