1

12 要素の *prim 配列があり、7 つの要素のみが初期化されています。コードは次のとおりです。

int f(int input)
{
    char *prim[12] = {"2", "3", "5", "7", "11", "13", "17"};
    int i;

    for(i=0; i<12; i++)
    {       
        if(i % input == 0)
        {
            strcat(result, prim[i]);
            strcat(result, " ");
        }
    }

    if(strlen(result) == 0)
    {
        printf("return -1");
    }
    else 
    {
        printf("%s\n", result);
        printf("return 0");
    }
}

i = 8 デバッガーの場合、アクセス違反の読み取り場所が表示されます。

私の友人が彼の大学のプログラミング基礎コースの試験のサンプルをくれたので、彼が合格するのを手伝う必要があります。

それで、私の質問は次のとおりです。C でのプログラミングについて私が知らないことはありますか、それとも教授が *prim の宣言を間違えましたか?

4

4 に答える 4

6
char *prim[12] = {"2", "3", "5", "7", "11", "13", "17"};

残りの 5 つの要素は、宣言したかのように null ポインターで初期化されます。

char *prim[12] = {"2", "3", "5", "7", "11", "13", "17", 0, 0, 0, 0, 0};

strcat(result, prim[i]);null ポインター引数を使用した呼び出しは、未定義の動作です。

于 2012-09-16T11:33:02.007 に答える
5

配列の初期化で初期化子を省略した場合、対応する場所は で初期化され0ます。したがって、ここでは、不足しているすべてのcharポインターが で初期化され0ます。これらの null ポインターを逆参照しようとすると、プログラムがクラッシュします。

これがあなたの教授にとって予期しない動作だったのか、単に黒板から間違ってコピーしただけなのか、または他のエラーがあるのか​​ 、私にはわかりません.

于 2012-09-16T11:32:18.327 に答える
1

位置 8 以降は 0 (NULL ポインター) に初期化されます。たとえば、C レクチャー ノートのこのセクションstrcatを参照してください。NULLポインターは定義されておらず、多くの一般的なシステムでセグメンテーション違反が発生します。または、あなたの場合は、アクセス違反で場所strcat読み取ろうとして読み取られます。ゼロアドレスで。

于 2012-09-16T11:34:50.080 に答える
0

試験問題: 入力 = 2 の場合、関数の結果は?

ここには非常に怪しいものがあります (これが試験の要点かもしれません)。

いずれにせよ、ここに私の観察があります:

  • EDIT:OPが編集されたため、これはもう当てはまりません。投稿した関数は、inputパラメーターをまったく使用していません。したがって、それが何をするのか、その結果は ( resultの定義に対して) パラメータに依存しません。

  • 関数は を返すように宣言されていますintが、return ステートメントがありません。まともなコンパイラは、少なくともそれについて警告します。

  • EDIT:OPが編集されたため、これはもう当てはまりませんが、コメントのように引数が2の場合は依然として当てはまります。strcat標準ライブラリ関数を参照する場合、関数は最終的に 2 番目の引数が NULL で関数を呼び出すため、segfault が保証されます。

  • 関数が何らかの理由で segfault を起こさなかったとしても、その結果が何を意味するのかは不明です。副作用に関しては、関数はいくつかのものを標準出力に出力する場合があります。用語または戻り値に関して、関数は整数を返しますが、return ステートメントがないと、その整数が何であるかを知る方法がありません。これは事実上、実装に依存するランダムな値です。

于 2012-09-16T11:57:06.307 に答える