我需要使用N值重新分配初始维度5的int数组,并用之前值的总和填充它们。 如果N <= 6,一切正常,但如果我把N == 7,程序崩溃时出现此错误:
a.out:malloc.c:2403:sysmalloc:断言`(old_top == initial_top (av)&amp;&amp; old_size == 0)|| ((unsigned long)(old_size)&gt; = MINSIZE&amp;&amp; prev_inuse(old_top)&amp;&amp; ((unsigned long)old_end&amp;(pagesize - 1))== 0)'失败。
我没有做任何特别或奇怪的事情,我也不知道为什么会有这种行为。 这是我的代码:
#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;
}
我在一个不同的指针中重新分配以避免问题。 帮助非常有用。感谢
答案 0 :(得分:7)
这是一个问题:
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
条目分配了空格,但随后循环到5+n
。 (在main
中你也可以循环到5+N
。也许你应该重新分配(5+n)
条目。
答案 1 :(得分:4)
在此处重新分配arr
a = realloc(arr, n * sizeof(int));
你不能再像以下那样使用它了:
for(i = 0; i < 5; i++)
somma += arr[i];
但只需使用a
,
答案 2 :(得分:2)
您调用LShift & RShift::send {LShift down}{LCtrl down}{LShift up}{LCtrl up}
在数组中分配realloc
个整数元素。然后你循环n
。在n + 5
函数中,当新数组只有main
个元素时,您会遍历N + 5
个元素。
当你走出界限时,当然会导致未定义的行为。