0

言語は C です。関数の引数として char* 型の配列 (char *array[] / char** 配列) があり、それらすべてを次のように行ごとに出力したいと考えています。

    while (*array) {

      printf("%s\n", *array);
      printf("after last print");
      array++;
    }

何らかの理由で、特定の入力ですべての値を出力することができますが、最後の *array が出力されるとすぐにクラッシュします。したがって、最後のprintfの後、「最後の印刷後」はもう印刷されません。残念ながら、私は gdb なしで netbeans C をサポートする Windows 7 を使用しています。netbeans にインストールしようとしたときにいくつか問題がありましたが、それはまた別の話です。

まず第一に、何が原因である可能性がありますか?次に、gdb なしでこの動作を最適にデバッグするにはどうすればよいでしょうか? 問題をデバッグして解決するのに役立つ回答があれば、それだけでもポイントを付与します。クラッシュの原因となった関数引数に関連する背景情報: strtok を使用して、char* 文字列から char** arr を生成しました。区切り文字としてスペースが使用されました。

編集:

追加情報: 同じ関数内で最後の *array を印刷しようとすると、正常に動作し、プログラムは正常に続行されます。したがって、これは機能します:

printf("%s\n", array[4]);

私のテストケースでは、NULL の前の最後のインデックスはたまたま 4 です。しかし、前に見たように同じことがループ内で行われると、それを印刷することはできますが、すぐにクラッシュし、2 行目が印刷されなくなります。

4

2 に答える 2

2

文字列配列の最後の要素を明示的に null に初期化しないと、初期化されていない (ワイルドポインター) になるため、逆参照するprintfとクラッシュします。

やる事:

  1. 文字列配列の最後の要素を明示的に NULL に初期化して、ループが実際に最後に停止することを認識できるようにします。
  2. ポインターをインクリメントする代わりに、ループ カウンター変数で逆参照するオフセットをインクリメントします。

このコードは私にとってはうまく機能し、クラッシュしません:

#include <stdio.h>
char *array[] = { "Hello", "World", "My", "Name", "Is", "Govind", "Parmar", NULL } ;

int main()
{   
    int i;
    for(i = 0; *(array+i); i++)
    {
        printf("%s\n", *(array+i));
    }
    printf("after last print\n");
    return 0;
}
于 2016-06-25T21:27:33.080 に答える