初期次元5のint配列をN個の値で再割り当てし、それらに前の値の合計を入力する必要があります。N <= 6の場合はすべて正常に機能しますが、N == 7を指定すると、プログラムが次のエラーでクラッシュします。
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;
}
問題を回避するために、別のポインターに再割り当てします。ヘルプは非常に便利です。ありがとう
ここに問題があります:
a = realloc(arr, n * sizeof(int));
for(i = 0; i < 5; i++)
somma += arr[i];
このrealloc
関数は、渡された引数を無効にしますarr
。をarr
書くことによって行うように、それは未定義の振る舞いを後で使用する原因になりますarr[i]
。
これを修正するには、合計をrealloc
行の前に移動します。
もう1つの問題は、次のループが範囲外に書き込むことです。
for(int j = i; j < (5+n); j++) {
a[j] = somma;
n
エントリにスペースを割り当てただけですが、ループアップし5+n
ます。(そしてmain
あなたもループし5+N
ます)。(5+n)
代わりに、エントリを再割り当てする必要があるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加