malloc の man ページには次のように書かれています:
だから、 malloc()
初期化されていないメモリを返します 、その内容は不確定です。
if (arr[i] != 0)
あなたのプログラムでは、呼び出されたメモリ ブロックの内容にアクセスしようとしました 未定義の動作 .
malloc
によって割り当てられたメモリ 初期化されていません。これらの場所の値は不確定です。この場合、そのメモリにアクセスすると、その場所の値が型のトラップ表現になる場合、未定義の動作が発生する可能性があります。
n1570-§6.2.6.1 (p5):
脚注には次のように書かれています:
動作が定義されていない場合、何も期待できません。期待した結果が得られる場合と得られない場合があります。
これが 40 年以上前に設計された方法です。
しかし、同時に calloc()
が作成されました。 割り当てられたメモリをゼロに初期化する関数 これは、配列にメモリを割り当てるための推奨される方法です。
行:
arr = (int *)malloc(sz * sizeof(int));
読むべきもの:
arr = calloc(sz, sizeof(int));
古い本から C を学んでいる場合、malloc()
によって返される値を常にキャストするように教えられています。 または calloc()
(void *
) を値を割り当てる変数の型に (int *
あなたの場合)。 malloc()
によって返される値が または calloc()
変数に直接代入されているため、最新バージョンの C ではそのキャストは必要ありません。