具有某些值的 realloc 的奇怪行为
Strange behaviour of realloc with certain values
我需要用 N 个值重新分配初始维度为 5 的 int 数组,并用先前值的总和填充它们。
如果 N <= 6 一切正常,但如果我把 N == 7,程序崩溃并出现此错误:
a.out: malloc.c:2403: sysmalloc: Assertion `(old_top == initial_top
(av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE &&
prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) ==
0)' failed.
我没有做任何特别或奇怪的事情,我也不知道为什么我会有这种行为。
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int * change(int * arr, int n)
{
int * a, i, somma = 0;
a = realloc(arr, n * sizeof(int));
for(i = 0; i < 5; i++)
somma += arr[i];
for(int j = i; j < (5+n); j++) {
a[j] = somma;
somma += a[j];
}
return a;
}
int main()
{
int N, i, *arr, *arr1;
arr = malloc(5 * sizeof(int));
printf("give me 5 numbers\n");
for(i = 0; i < 5; i++)
scanf("%d", &arr[i]);
printf("give me N number to use in realloc\n");
scanf("%d", &N);
arr1 = change(arr, N);
for(i = 0; i < (5+N); i++) {
printf("%d\n", arr1[i]);
}
return 0;
}
我在不同的指针中重新分配以避免出现问题。
帮助非常有用。谢谢
这里有个问题:
a = realloc(arr, n * sizeof(int));
for(i = 0; i < 5; i++)
somma += arr[i];
realloc
函数使传递的参数无效,arr
。之后使用 arr
会导致未定义的行为,就像您通过编写 arr[i]
.
所做的那样
要解决此问题,您可以将总和移动到 realloc
行之前。
还有一个问题是下一个循环写越界:
for(int j = i; j < (5+n); j++) {
a[j] = somma;
您只为 n
个条目分配了 space,但随后循环到 5+n
。 (在 main
中你也循环到 5+N
)。也许您应该重新分配 (5+n)
个条目。
您在此处重新分配 arr
之后
a = realloc(arr, n * sizeof(int));
您不能再像这里那样使用它了:
for(i = 0; i < 5; i++)
somma += arr[i];
但只需使用 a
,
您调用 realloc
以在数组中分配 n
个整数元素。然后你循环 n + 5
。同样在 main
函数中,当新数组只有 N
个元素时,你循环遍历 N + 5
个元素。
当您越界时,这当然会导致 未定义的行为。
我需要用 N 个值重新分配初始维度为 5 的 int 数组,并用先前值的总和填充它们。 如果 N <= 6 一切正常,但如果我把 N == 7,程序崩溃并出现此错误:
a.out: malloc.c:2403: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
我没有做任何特别或奇怪的事情,我也不知道为什么我会有这种行为。 这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int * change(int * arr, int n)
{
int * a, i, somma = 0;
a = realloc(arr, n * sizeof(int));
for(i = 0; i < 5; i++)
somma += arr[i];
for(int j = i; j < (5+n); j++) {
a[j] = somma;
somma += a[j];
}
return a;
}
int main()
{
int N, i, *arr, *arr1;
arr = malloc(5 * sizeof(int));
printf("give me 5 numbers\n");
for(i = 0; i < 5; i++)
scanf("%d", &arr[i]);
printf("give me N number to use in realloc\n");
scanf("%d", &N);
arr1 = change(arr, N);
for(i = 0; i < (5+N); i++) {
printf("%d\n", arr1[i]);
}
return 0;
}
我在不同的指针中重新分配以避免出现问题。 帮助非常有用。谢谢
这里有个问题:
a = realloc(arr, n * sizeof(int));
for(i = 0; i < 5; i++)
somma += arr[i];
realloc
函数使传递的参数无效,arr
。之后使用 arr
会导致未定义的行为,就像您通过编写 arr[i]
.
要解决此问题,您可以将总和移动到 realloc
行之前。
还有一个问题是下一个循环写越界:
for(int j = i; j < (5+n); j++) {
a[j] = somma;
您只为 n
个条目分配了 space,但随后循环到 5+n
。 (在 main
中你也循环到 5+N
)。也许您应该重新分配 (5+n)
个条目。
您在此处重新分配 arr
之后
a = realloc(arr, n * sizeof(int));
您不能再像这里那样使用它了:
for(i = 0; i < 5; i++)
somma += arr[i];
但只需使用 a
,
您调用 realloc
以在数组中分配 n
个整数元素。然后你循环 n + 5
。同样在 main
函数中,当新数组只有 N
个元素时,你循环遍历 N + 5
个元素。
当您越界时,这当然会导致 未定义的行为。