我正在尝试使用 realloc 为我的动态数组添加内存。但在我的代码中,realloc 为数组添加了额外的内存。假设我最初想创建包含 5 个项目的数组,然后想添加 3 个项目,因此数组的总长度应该是 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
分配的数组未超过规定值。您只是计算错误了大小。
您最初读入 5 个值
n
,然后读入 5 个值。当您随后读入 3 个值added_values
,随后再读入 3 个值时,您会n
为读入的每个项目递增。因此,总共读入 8 个项目后,
n
现在等于 8。加上 3 得到 11。你这里还面临一个更大的问题:
这并不是增加内存大小来保存 3 个额外
int
值,而是将总大小设置为 3 个int
值。因此,将额外元素写入数组会触发未定义的行为。您需要修复这个重新分配以考虑总大小,并且您应该使用单独的变量来跟踪您正在写入的当前索引。