-1
char* buf;
buf = malloc(BUFSIZ);
memset(buf ,0 , BUFSIZ);

memsetはbuf変数をBUFSIZのサイズで初期化すると思いますが、mallocもメモリのサイズBUFSIZEのブロックを割り当てて、変数bufにブロックの先頭へのポインタを返す... memsetが使えるかどうかわかりませんサイズBUFSIZEでデータを初期化するため、ポインターの場合、私たちはそれに注意しません....この問題を解決するために何か提案できますか、ありがとう


こんにちは、答えてくれてありがとう。そのため、問題は一般に malloc が失敗する可能性があり、その後 buf が NULL を指すという事実に起因することを理解しました。そして、コードの欠陥を修正する最善の方法は、buf が null に等しいかどうかを確認することでしょうか?

char* buf;
buf = malloc(BUFSIZ);
if(buf!=null)
{
memset(buf ,0 , BUFSIZ);
}

コードの欠陥を修正する最善の方法は、buf が null に等しいかどうかを確認することでしょうか?

char* buf;
buf = malloc(BUFSIZ);
if(buf!=null)
{
memset(buf ,0 , BUFSIZ);
}

実際に malloc が失敗する可能性はありますか? それとも単なる理論ですか?

4

4 に答える 4

3

メモリを割り当てた後に NULL をチェックしないという事実を除いて、そのコードには問題はありません。

calloc を使用してメモリを割り当て、0 で初期化することもできることに注意してください。これにより、memset 呼び出しを回避できます。

char * buf;

buf = calloc( 1, BUFSIZ );

if( buf == NULL )
{
    /* Error management */
}
于 2011-11-09T19:38:52.570 に答える
2

malloc が失敗して NULL ポインタを返さなければ、これで問題ありません。

bufBUFSIZ バイトの大きさの割り当てられたメモリの先頭を指します。memset は、 が指すメモリーから始まる BUFSIZ バイトを 0 に設定しますbuf

于 2011-11-09T19:37:35.023 に答える
0

memsetは次と同等です。

void *memset(void *s, int c, size_t n) {
    char *ss = (char *)s;
    while (n--)
        *ss++ = c;
    return s;
}

したがって、はい、ポインターで使用できます (そして使用されます)。sおよびそれに(n-1)続くバイトを に設定sしますc

于 2011-11-09T19:40:55.727 に答える
0
char* buf; // u declare a pointer, pointing to some random memory area
buf = malloc(BUFSIZ); // you allocate BUFSIZ bytes on the heap and set buf to point to that area.
memset( buf, 0, BUFSIZE ); // the area where buf points to are all set to 0, all BUFSIZE of them.

かなり簡単に思えます。

memset は少し似ています:

for (unsigned char *p = buf; p < buf + BUFSIZE; *p++ = '\0' );
于 2011-11-09T19:42:04.463 に答える