-1

私はCのポインターを紹介されたばかりで、それらに慣れるためにそれらをいじっています。

以下のコードがコンパイルされない理由を誰か説明してもらえますか?

int *high = (int *)malloc(sizeof(int)),*low = (int *)malloc(sizeof(int));
*high = 100;
*low = 0;
4

2 に答える 2

1

#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);
于 2013-02-18T07:19:32.123 に答える
0

以下に示すようにコードをラップすると、コンパイルして期待どおりに動作するようになります。

#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*。さらに、そうすることはお勧めできません。たとえば、問題の関数のプロトタイピングが欠落している場合、キャストを使用すると、キャストせずにコンパイラによって表示されるエラー/警告が抑制されるなど、エラーが隠される可能性があるためです。

于 2013-02-18T07:19:45.890 に答える