私はCのポインターを紹介されたばかりで、それらに慣れるためにそれらをいじっています。
以下のコードがコンパイルされない理由を誰か説明してもらえますか?
int *high = (int *)malloc(sizeof(int)),*low = (int *)malloc(sizeof(int));
*high = 100;
*low = 0;
#include stdlib.h がある場合は、コンパイルする必要があります。
コードが正しいことを確認するには、次のように置き換えます。
#include <stdlib.h>
int *high = malloc(sizeof(int));
int *low = malloc(sizeof(int));
if(high == NULL || low == NULL)
{
// no memory, error handling here
}
*high = 100;
*low = 0;
...
free(high);
free(low);
以下に示すようにコードをラップすると、コンパイルして期待どおりに動作するようになります。
#include <stdlib.h>
int main()
{
int *high = malloc(sizeof(int)),*low = malloc(sizeof(int));
*high = 100;
*low = 0;
return 0;
}
とにかく、このコードにはシステム コールのエラー チェックがありません。常にシステム コールの戻り値を確認してください。要求どおりにメモリを割り当てることができなかった場合はmalloc()
、 の値が返されます。NULL
そのような場合、ライン
*high = 100;
*NULL
逆参照は未定義の動作を引き起こすため、プログラムがクラッシュする可能性が最も高くなります。
C では、 の値を返す関数をキャストする必要はありませんvoid*
。さらに、そうすることはお勧めできません。たとえば、問題の関数のプロトタイピングが欠落している場合、キャストを使用すると、キャストせずにコンパイラによって表示されるエラー/警告が抑制されるなど、エラーが隠される可能性があるためです。