使用realloc扩展动态数组时实际大小超出预期的原因咨询
动态数组realloc追加内存后长度异常的问题分析
你遇到的问题是使用realloc为动态数组追加内存后,实际数组长度远大于预期的8,且出现乱码值,核心问题出在两处关键错误:
原代码
#include <stdio.h> #include <stdlib.h> int main() { int n, i, added_data; int *data; printf("Enter the total number of elements: "); scanf("%d", &n); data = (int *)calloc(n, sizeof(int)); if (data == NULL) { printf("Error!!! memory not allocated."); exit(0); } for (i = 0; i < n; i++) { printf("Enter number %d: ", i + 1); scanf("%d", data + i); } printf("Enter number of elements to add: "); scanf("%d", &added_data); if(added_data > 0) { data = realloc(data, added_data * sizeof(int)); for (i=0; i < added_data; i++) { //n++; printf("Enter number %d: ", i + 1); scanf("%d", data + n); n++; } } int new_length = n + added_data; printf("\nnew length of array: %d", new_length); printf("\n"); for(i=0;i<new_length;i++) { printf("%d\n", data[i]); } printf("\n"); free(data); return 0; }
运行输出
Enter the total number of elements: 5 Enter number 1: 1 Enter number 2: 2 Enter number 3: 3 Enter number 4: 4 Enter number 5: 5 Enter number of elements to add: 3 Enter number 1: 55 Enter number 2: 99 Enter number 3: 88 new length of array: 11 1 2 3 4 5 55 99 88 10053856 0 10027344
错误分析
realloc内存大小计算错误
你调用realloc(data, added_data * sizeof(int))时,只分配了added_data个int的内存,这会把原来n个元素的内存空间缩小,导致原数组的部分数据丢失,同时后续写入新元素时会超出分配的内存范围,触发未定义行为。正确的内存大小应该是原数组长度 + 新增元素长度,即(n + added_data) * sizeof(int)。新长度计算重复累加
在新增元素的循环中,你已经通过n++把原长度5更新为8(5+3),但后续计算new_length = n + added_data时,又把8和3相加得到11,这完全错误。实际新长度就是更新后的n,或者直接用原n + added_data,不需要重复累加。
修正后的代码
#include <stdio.h> #include <stdlib.h> int main() { int n, i, added_data; int *data; printf("Enter the total number of elements: "); scanf("%d", &n); data = (int *)calloc(n, sizeof(int)); if (data == NULL) { printf("Error!!! memory not allocated."); exit(0); } for (i = 0; i < n; i++) { printf("Enter number %d: ", i + 1); scanf("%d", data + i); } printf("Enter number of elements to add: "); scanf("%d", &added_data); if(added_data > 0) { // 修正:分配原长度+新增长度的内存 int *temp = realloc(data, (n + added_data) * sizeof(int)); // 注意:realloc可能失败,建议用临时指针接收,避免原指针丢失 if(temp == NULL) { printf("Error!!! realloc failed."); free(data); exit(0); } data = temp; for (i=0; i < added_data; i++) { printf("Enter number %d: ", n + i + 1); scanf("%d", data + n + i); } // 更新数组总长度 n += added_data; } printf("\nnew length of array: %d", n); printf("\n"); for(i=0;i<n;i++) { printf("%d\n", data[i]); } printf("\n"); free(data); return 0; }
另外补充一个细节:直接用data = realloc(data, ...)存在风险,如果realloc失败返回NULL,会导致原内存指针丢失,无法释放。所以建议用临时指针接收realloc的返回值,确认成功后再赋值给原指针。
内容的提问来源于stack exchange,提问作者user4221591
相关产品推荐
相关产品推荐

