0

以下のコード スニペットを検討してください。

#include <stdio.h>

int main()
{
    int p = malloc( sizeof( int ) );
    return 0;
}

上記のプログラムは、警告なしで正常にコンパイルされます。

integer variableメモリチャンクのアドレスがポインタではなく格納されているため、エラー/警告を出すべきではありませんか?

を含めるのを忘れていたので、最初は動作がおかしいと思いましたstdlib。すぐに、私の仮定は失敗しました。を含めても動作は同じstdlibです。

含めた後、以下のプログラムを参照してくださいstdlib

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int p = malloc( sizeof( int ) );
    return 0;
}

このプログラムも同様の動作をします。

正常にコンパイルされるのはなぜですか?

4

2 に答える 2

1

正常にコンパイルされますが、次の警告が表示されます。

> gcc -o test test.c
test.c: In function ‘main’:
test.c:6:13: warning: initialization makes integer from pointer without a cast [enabled by default]

コンパイラの警告は破棄しないでください。オプションなしでgcc 4.7を使用しました。

于 2012-09-16T18:38:07.683 に答える
0

malloc()void *タイプを返しています。そのintに返して保存するのは、のアドレスですvoid *。これは完全に合法的なことです。たとえば、mallocされたメモリのアドレスを使用する前にprintfしたい場合は、次のことができます。

int main()
{
    int *r = NULL;
    int p = malloc( sizeof( int ) );
    printf("%#x\n",p);
    r = (int *)p; 
    *r = 5;
    printf("%d\n", *r);
    free(r);
    return 0;
}

明らかに、これはあまり意味がありません...しかし、このコードを使用するときにエラーが発生しないのには理由があります。警告に関する限り...あなたは警告を受け取るべきでした。

VSは以下を提供します:

1>c:\users\ma\documents\visual studio 2010\projects\test\test\test.c(7): warning C4047: 'initializing' : 'int' differs in levels of indirection from 'void *' 
于 2012-09-16T20:06:21.613 に答える