0

私は組み込みシステム用にこのかなり大きなコードを書きました。関数は、ループ内で値を計算して calloc 構造体に代入するために使用されます。コードにバグがあり、特定して修正するのに時間がかかりました。必要に応じて私の経験を共有する前に、他の誰かがバグを指摘できるかどうかを確認したいと思います.

宣言ブロック:

int *arr;
int i, num;
printf("Enter number of elements: ");
scanf("%d", &num); //Assume num>=0
arr = calloc(num, sizeof(int));
if (arr == NULL)
    return;
i = num;

free() の呼び出し時に例外をスローするのは、次のコードのブロックのうちどれですか?その理由は?

for (i; i > 0; i--) {
    arr[num - i] = i;
}
free(arr);

また

while (i--) {
    arr[num - i] = i;
}
free(arr);
4

3 に答える 3

4

2番目のループ

while (i--) 
{
  arr[num - i] = i;
  printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}

iのポストデクリメントが原因で問題が発生します

最初に開始するi == 10ので、最初の割り当てはarr[10 - 9] = 9;です。あなたが得る最後のループであるにi達するとき1arr[10 - 0] = 0

割り当てが配列範囲0..9の外に書き込まれるようにします

このようにwhileループを書くと、うまくいくはずです

do 
{
  arr[num - i] = i;
  printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}
while (--i);
于 2012-11-23T06:25:33.207 に答える
2

for正しいですが、whileループに問題があります

この簡単なものを試してください:

    for(i=0;i<num;i++)
       arr[i]=i;
    free(arr);

    i=0;
    while(i<num)
       {
       arr[i]=i;
       i++;
      }
    free(arr);
于 2012-11-23T06:24:20.517 に答える
0

もう 1 つの問題は、ユーザーが に負の値を入力するとnum、while ループが無限になる可能性があることです。-1または他の負の値は に評価されTrueます。iまた、割り当てたメモリの境界 (下限または上限) を超えると、セグメンテーション違反が発生する可能性があります。

于 2012-11-23T07:08:00.090 に答える