C语言 当我将 malloc 返回的地址存储在整数变量中时,程序编译成功



请考虑以下代码片段:

#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 *' 

相关内容

  • 没有找到相关文章

最新更新