使用C语言realloc()函数时出现逻辑错误的问题排查
动态内存分配中realloc导致垃圾值的问题分析
我在C语言中用动态内存分配处理一个简单问题:需要获取用户输入的两个数组元素,计划先初始化大容量数组,输入完成后用realloc()缩小容量。但运行时realloc()会覆盖已输入元素并填充垃圾值,代码如下:
void arrayop() { int val, i=0; int *arr1 = (int*) calloc(100,sizeof(int)); int *arr2 = (int*) calloc(100,sizeof(int)); printf("Enter first array:(-1 to stop)\n"); while(val!=-1) { if(val != -1) { scanf("%d",&val); *(arr1 + i) = val; i++; } } //printf("\t%d\n",i); arr1 = (int*)realloc(arr1,(i)); //printf("\t%d\n",(sizeof(arr1))); for(int j=0;j<i;j++) { printf("%d ",*(arr1 + j)); } printf("\n"); }
问题原因
val未初始化就参与循环判断:val是局部变量,默认未初始化,初始值为随机垃圾值。如果这个初始值恰好是-1,循环直接不执行;若不是,后续逻辑也会因初始值的随机性出现异常。realloc的内存大小参数错误:realloc的第二个参数要求传入总字节数,你仅传入了元素个数i,而非i * sizeof(int)。比如i=3时,仅分配3字节,而一个int通常占4字节,实际分配的空间连1个完整的int都装不下,后续访问数组必然越界,读取到垃圾值。输入逻辑顺序错误:当前代码会把终止符
-1也存入数组,且i会多计数一次。流程是先判断val!=-1,再读取值、存入数组、i++,导致最后输入的-1被存在数组里,i的数值比实际有效元素个数多1,进一步加剧内存越界问题。
修正后的代码示例
void arrayop() { int val, i=0; int *arr1 = calloc(100, sizeof(int)); int *arr2 = calloc(100, sizeof(int)); printf("Enter first array:(-1 to stop)\n"); // 先读取第一个值,再判断是否进入循环 scanf("%d", &val); while(val != -1) { arr1[i] = val; i++; scanf("%d", &val); } // 重新分配内存,传入正确的字节数 int *temp = realloc(arr1, i * sizeof(int)); // 检查realloc是否成功(避免内存分配失败导致原指针丢失) if(temp != NULL) { arr1 = temp; } for(int j=0; j<i; j++) { printf("%d ", arr1[j]); } printf("\n"); // 释放动态分配的内存,避免内存泄漏 free(arr1); free(arr2); }
内容的提问来源于stack exchange,提问作者Sharvansh Shukla
相关产品推荐
相关产品推荐

