0

このコードは、セグメンテーション違反を引き起こします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SLIDINGWINDOW 5
#define SEGMENTSIZE 100

int main() {
    char** send_buffer = (char**) malloc (SLIDINGWINDOW);
    int i;
    for (i = 0; i<SLIDINGWINDOW; ++i) {
        send_buffer[i] = (char*) malloc (SEGMENTSIZE);

    }
    for (i = 0; i<SLIDINGWINDOW; ++i) {
        strcpy(send_buffer[i], "Hello, world");
        printf("%s\n", send_buffer[i]);
        fflush(NULL);
    }
}

奇妙なことに、2 番目のループの内容を最初のループに入れると、うまくいきます!

なぜこれが起こるのか誰にもわかりますか?どうもありがとう!

4

2 に答える 2

6

に渡されたサイズがmalloc()正しくありません。あなたはおそらく次のことを意味していました:

char** send_buffer = malloc (SLIDINGWINDOW * sizeof(send_buffer[0]));

send_buffer[i] = malloc (SEGMENTSIZE * sizeof(send_buffer[i][0]));

これは、 to の引数malloc()が要求するバイト数であるため、必要な長さに要素のサイズを掛ける必要があるためです。

さらに、から返された値が isn でないことも確認する必要 malloc()がありNULLます。

malloc 呼び出しからキャストを削除したことに注意してください。C では、キャストは必要なく、エラーをマスクできる場合もあります。


さらなる改善はstrncpy()、セグメントの終了後に文字を書き込まないようにするために使用することです:

strncpy(send_buffer[i], "Hello, world", SEGMENTSIZE);

ソース文字列が より大きい場合SEGMENTSIZE、宛先文字列は null で終了しないことに注意してください。これは次の方法で修正できます。

send_buffer[i][SEGMENTSIZE - 1] = '\0';

の後strncpy()

于 2012-08-27T04:10:10.827 に答える
2

SLIDINGWINDOW これにより、バイトに十分なスペースのみが生成されます。

malloc (SLIDINGWINDOW)

SLIDINGWINDOW ポインタ用に十分なスペースが必要です:

malloc (SLIDINGWINDOW * sizeof(char*))

あなたの 2 番目malloc()は運が良ければ正しいです。sizeof(char)は常に1

于 2012-08-27T04:10:53.137 に答える