【发布时间】: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;
}
我在不同的指针中重新分配以避免问题。 帮助非常有用。谢谢
【问题讨论】:
-
我使用
clang -O0 -Wall -g,编译效果很好。我还使用调试器来了解行为 -
旁注:
malloc & co.函数可能会失败:检查返回值总是 -
@StoryTeller 关于在 realloc 之后使用指针的问题的报道可能对未来的读者有益。 MCVE 中的“M”不能按字面意思理解(否则我们正在玩代码高尔夫),IMO 这个程序足够短,可以在一个块中消化,并且没有大量可以剥离
-
@M.M - 您有权获得该意见。没有人会剥夺你的声音并禁止你投票。其他人也有权获得他们的投票权,他们的反对票不会使他们成为“巨魔”。在这一点上,这是一场哲学辩论,由于 cmets 不适合进行扩展讨论,让我们同意不同意代码示例的优点。