11
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
    int *test = malloc(15 * sizeof(int));
    for(int i = 0;i < 15 ;i  ++ )
        printf("test is %i\n",test[i]);

    memset(test,0,sizeof(int) * 15);

    for(int i = 0 ; i < 15; i ++ )
        printf("test after memset is %i\n",test[i]);

    return 0;
}

私が得る出力は非常に奇妙です:

    test is 1142126264
    test is 32526
    ...
    test is 1701409394
    test is 1869348978
    test is 1694498930
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0
    ...
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0

なぜそれが起こるのでしょうか?mallocすぐに使える新しい記憶を編集したばかりだと思いましたか?

では、これはどうですか?

int test[15];

電話する必要があります memset(&test,0,sizeof(int) * 15);か?

4

4 に答える 4

22

malloc割り当てたメモリを初期化しません。ランダムなガベージが既にそこにあったものを取得するだけです。すべてを 0 に設定する必要がある場合callocは、パフォーマンスが低下します。(0 以外に初期化する必要がある場合は、memsetfor バイト配列を使用し、それ以外の場合は配列を手動でループして初期化します。)

于 2012-11-16T04:46:00.883 に答える
2

C11 7.22.3.4

void *malloc(size_t size);

malloc 関数は、サイズがsizeで指定され、値が不定であるオブジェクトにスペースを割り当てます。

値をゼロに設定する場合は、calloc代わりに使用してください。基本的には、 への 1 回の呼び出しと への 1calloc回の呼び出しの単なるラッパー関数です(設定する値は 0 です)。mallocmemset

于 2012-11-16T07:38:32.667 に答える
1

ヒープからメモリを要求すると、ヒープは利用可能なメモリのブロックを割り当てるだけです。このメモリ ブロックには、以前の書き込みに応じたデータが含まれる場合があります。

于 2012-11-16T04:44:33.123 に答える
0

パフォーマンス上の理由から、malloc() は新しく割り当てられたメモリの内容に関して保証しません。ゼロかもしれないし、ランダムデータかもしれないし、何でもありかもしれません。malloc されたメモリに特定の値を持たせたい場合は、それを行うのはあなた次第です。

于 2012-11-16T04:50:19.453 に答える