【问题标题】:Strange behaviour of realloc with certain values具有某些值的 realloc 的奇怪行为
【发布时间】:2017-01-26 10:44:06
【问题描述】:

我需要用 N 个值重新分配一个初始维度为 5 的 int 数组,并用先前值的总和填充它们。 如果 N

a.out: malloc.c:2403: sysmalloc: 断言`(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (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;
}

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

【问题讨论】:

  • 编译所有警告和调试信息(例如,gcc -Wall -g,如果使用GCC...)。改进您的代码以获得没有警告。然后使用调试器(例如gdb ....)和valgrind
  • 我使用clang -O0 -Wall -g,编译效果很好。我还使用调试器来了解行为
  • 旁注:malloc &amp; co. 函数可能会失败:检查返回值总是
  • @StoryTeller 关于在 realloc 之后使用指针的问题的报道可能对未来的读者有益。 MCVE 中的“M”不能按字面意思理解(否则我们正在玩代码高尔夫),IMO 这个程序足够短,可以在一个块中消化,并且没有大量可以剥离
  • @M.M - 您有权获得该意见。没有人会剥夺你的声音并禁止你投票。其他人也有权获得他们的投票权,他们的反对票不会使他们成为“巨魔”。在这一点上,这是一场哲学辩论,由于 cmets 不适合进行扩展讨论,让我们同意不同意代码示例的优点。

标签: c realloc


【解决方案1】:

这里有个问题:

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) 条目。

【讨论】:

  • 感谢您的帮助
【解决方案2】:

您在此处重新分配arr

 a = realloc(arr, n * sizeof(int));

你不能再像这里那样使用它了:

 for(i = 0; i < 5; i++)
   somma += arr[i];

但只需改用a

【讨论】:

    【解决方案3】:

    您调用realloc 来分配数组中的n 整数元素。然后你循环n + 5。在main 函数中也是如此,当新数组只有N 元素时,循环遍历N + 5 元素。

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

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多