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'ed 内存之前打印它的地址,您可以:

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 回答