-1

C で memset 関数を使用していますが、問題があります。これが私の問題です:

char* tail;
tail = //some memory address
int pbytes = 5;

次のようにmemsetを呼び出すと:

**memset(tail+pbytes, 0 , 8); // It gives no error**

次のようにmemsetを呼び出すと:

**memset(tail+pbytes, 0 , 9); // It goes into infinite loop**

次のようにmemsetを呼び出すと:

**memset(tail+pbytes, 0 , 10); // last parameter (10 or above). It gives Segmentation fault**

この理由は何ですか?プログラムが実行され、必要に応じて出力が得られますが、最終的にセグメンテーション違反が発生します。Linux 64 仮想マシンを使用しています。

どんな助けでも大歓迎です。

わかった。私がやっていることをもっと明確にしましょう。128 バイト (配列で 0-127) のデータを作成しています。112バイト目から119バイト目まで0(NULL)を書いた(うまくいく)のですが、120バイト目に0を書き込んで実行しようとすると無限ループに陥ってしまいます。120 バイト目に 1,2,4,6 と書くと、プログラムはうまく動きます。120 バイト目に他の数値を書き込むと、プログラムはセグメンテーション フォールトを返します。基本的に 120 から 127 のバイトに何か問題があります。

4

1 に答える 1

0

これは問題ありませんmemset。ポインタ変数の定義方法に問題がありますtail

簡単に書いたら

    char tail[128];
    memset(tail+5, 0, 9);

もちろんうまくいくでしょう。あなたの問題は、単純で正しいことをしていないことです。次のような、あいまいで正しくないことをしている

    char tail[1];
    memset(tail+5, 0, 9);

また

void foo(int x) {
    char *tail = &x;
    memset(tail+5, 0, 9);
}

Charles Babbage の言葉を借りれば、間違ったコードをマシンに入れると、間違った答えが出てきます。

segfault はおそらく、まだ割り当てられていない仮想アドレスに書き込もうとしていることが原因です。無限ループは、memset の戻りアドレスの一部を上書きしているため、呼び出された場所に戻るのではなく、間違った場所 (無限ループの途中など) に戻ることが原因である可能性があります。

于 2012-12-05T19:52:48.617 に答える