14

次のコードを実行すると:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    p = strcmp(NULL,"foo");

    return 0;
}

セグメンテーション違反が発生します。エコー $? 139 と言います。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    strcmp(NULL,"foo"); // Note removed assignment

    return 0;
}

セグメンテーション違反はありません。誰か光を投げてくれませんか?

これが私のgcc情報です:

> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
4

3 に答える 3

30

コンパイル時に最適化オプションを使用している可能性があります。2 番目のスニペットの結果strcmp()は無視されるため、コンパイラはこの関数呼び出しを排除します。これが、プログラムがクラッシュしない理由です。が組み込み関数であるため、この呼び出しを削除できますstrcmp()。コンパイラは、この関数に副作用がないことを認識しています。

于 2011-02-08T12:22:33.050 に答える
6

必要がある:

  • 適切なヘッダーを含めるか、関数を手動で宣言してください。にはstrcmp()、 が必要<string.h>です。
  • NULL などの無効なポインターを に渡さstrcmp()ないでください。これは、保護されず、ポインターを逆参照するため、プログラムで未定義の動作が発生するためです。
于 2011-02-08T12:22:17.007 に答える
3

あなたがしていることは未定義です。strcmpnull で終わる文字列への有効なポインターが必要です。

NULLnull で終わる文字列へのポインターではありません。

于 2011-02-08T12:20:43.787 に答える