具有某些值的 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 个元素。

当您越界时,这当然会导致 未定义的行为