请考虑以下代码片段:
#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;
}
该程序也有类似的行为。
为什么编译成功?
它编译成功,但您应该收到警告:
> 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。
malloc()
返回void *
类型。您要返回并存储在该int中的是void *
的地址。这是一件完全合法的事情,例如,如果您想在使用之前打印错误内存的地址,您可以:
int main()
{
int *r = NULL;
int p = malloc( sizeof( int ) );
printf("%#xn",p);
r = (int *)p;
*r = 5;
printf("%dn", *r);
free(r);
return 0;
}
显然这并没有多大意义...但是使用此代码时没有收到错误是有原因的。就警告而言...你应该得到一个。
VS 给出:
1>c:usersmadocumentsvisual studio 2010projectstesttesttest.c(7): warning C4047: 'initializing' : 'int' differs in levels of indirection from 'void *'