realloc 错误 - 递增数组的最后一个元素
realloc bug - incrementing last element of array
我正在尝试使用 realloc
实现一个动态递增的数组。我用 malloc
创建数组,然后调用我的 add
函数,它将数组大小增加 1。代码如下:
#include <stdio.h>
#include <stdlib.h>
int *foo;
int quantity;
void add(int number) {
foo = (int*) realloc(foo, sizeof(foo) + sizeof(int));
foo[quantity] = number;
quantity++;
}
void debugFoo() {
for (int i = 0; i < quantity; i++) {
printf("foo[%i] = %i\n", i, foo[i]);
}
printf("\n");
}
int main() {
quantity = 3;
foo = (int*) malloc(quantity * sizeof(int));
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
debugFoo();
add(20);
debugFoo();
add(2);
debugFoo();
return 0;
}
但是当我 运行 它时,我得到以下输出:
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 20
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2
如您所见,我第二次调用 add
时,foo[3] 的值增加了 1。奇怪的是,只有当传递给 add
的第一个值是偶数时,它才会递增。将第 30 行更改为 add(21)
,我得到以下输出:
[...]
foo[2] = 3
foo[3] = 21
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2
这是一个错误还是我使用 realloc
错误?
sizeof(foo)
总是 return 给你相同的值,可能是 4。因为 sizeof 运算符 return 给你 int *
[=20= 的大小]
您已经 "correctly" 声明了一个全局范围变量 (quantity
) 来存储您数组的当前大小,将该变量用于 realloc
您的结构,就像您对 malloc
.
void add(int number) {
quantity++;
foo = realloc(foo, (quantity * sizeof(int)) );
if (foo != NULL)
{
foo[quantity-1] = number;
}
else
{
fprintf(stderr, "Failed to add number.\n");
}
}
请注意,始终检查函数 return 值非常重要。
如我在 returned 值 realloc
的示例中所示,您必须在 main
函数中对 malloc
执行相同的操作。
int main() {
quantity = 3;
foo = malloc(quantity * sizeof(int));
if (foo != NULL)
{
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
debugFoo();
add(20);
debugFoo();
add(2);
debugFoo();
return 0;
}
else
{
fprintf(stderr, "Failed to allocate array.\n");
return 1;
}
}
sizeof(foo)
不是分配缓冲区的大小而是foo
的大小,即int*
。使用保存的元素数来计算新的缓冲区大小。
foo = (int*) realloc(foo, sizeof(int) * (quantity + 1));
我正在尝试使用 realloc
实现一个动态递增的数组。我用 malloc
创建数组,然后调用我的 add
函数,它将数组大小增加 1。代码如下:
#include <stdio.h>
#include <stdlib.h>
int *foo;
int quantity;
void add(int number) {
foo = (int*) realloc(foo, sizeof(foo) + sizeof(int));
foo[quantity] = number;
quantity++;
}
void debugFoo() {
for (int i = 0; i < quantity; i++) {
printf("foo[%i] = %i\n", i, foo[i]);
}
printf("\n");
}
int main() {
quantity = 3;
foo = (int*) malloc(quantity * sizeof(int));
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
debugFoo();
add(20);
debugFoo();
add(2);
debugFoo();
return 0;
}
但是当我 运行 它时,我得到以下输出:
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 20
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2
如您所见,我第二次调用 add
时,foo[3] 的值增加了 1。奇怪的是,只有当传递给 add
的第一个值是偶数时,它才会递增。将第 30 行更改为 add(21)
,我得到以下输出:
[...]
foo[2] = 3
foo[3] = 21
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2
这是一个错误还是我使用 realloc
错误?
sizeof(foo)
总是 return 给你相同的值,可能是 4。因为 sizeof 运算符 return 给你 int *
[=20= 的大小]
您已经 "correctly" 声明了一个全局范围变量 (quantity
) 来存储您数组的当前大小,将该变量用于 realloc
您的结构,就像您对 malloc
.
void add(int number) {
quantity++;
foo = realloc(foo, (quantity * sizeof(int)) );
if (foo != NULL)
{
foo[quantity-1] = number;
}
else
{
fprintf(stderr, "Failed to add number.\n");
}
}
请注意,始终检查函数 return 值非常重要。
如我在 returned 值 realloc
的示例中所示,您必须在 main
函数中对 malloc
执行相同的操作。
int main() {
quantity = 3;
foo = malloc(quantity * sizeof(int));
if (foo != NULL)
{
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
debugFoo();
add(20);
debugFoo();
add(2);
debugFoo();
return 0;
}
else
{
fprintf(stderr, "Failed to allocate array.\n");
return 1;
}
}
sizeof(foo)
不是分配缓冲区的大小而是foo
的大小,即int*
。使用保存的元素数来计算新的缓冲区大小。
foo = (int*) realloc(foo, sizeof(int) * (quantity + 1));