具有特定值的realloc的奇怪行为

时间:2017-01-26 10:44:06

标签: c realloc

我需要使用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;
}

我在一个不同的指针中重新分配以避免问题。 帮助非常有用。感谢

3 个答案:

答案 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个元素。

当你走出界限时,当然会导致未定义的行为