Программа успешно компилируется, когда я сохраняю адрес, возвращаемый 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;
}

Эта программа также ведет себя похожим образом.

Почему он успешно компилируется?


person Green goblin    schedule 16.09.2012    source источник
comment
Это зависит от компилятора. Вы должны попробовать скомпилировать с -Wall.   -  person Aaron Dufour    schedule 16.09.2012
comment
Включите все предупреждения и ошибки, прежде чем публиковать здесь. С GCC, скажем, по крайней мере -pedantic -Wall -Wextra.   -  person Kerrek SB    schedule 16.09.2012
comment
Где возможность включить предупреждения на ideone?   -  person Green goblin    schedule 16.09.2012
comment
@Aashish, попробуйте liveworkspace.org. Он более современен и включает несколько хороших опций. У него даже есть усиление.   -  person chris    schedule 16.09.2012
comment
Также вы не включили stdlib, поэтому вам удалось создать печально известную ошибку malloc. Прочитайте это.   -  person Lundin    schedule 16.09.2012


Ответы (2)


Он успешно компилируется, но вы должны получить предупреждение :

> 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 без каких-либо опций.

person Kwariz    schedule 16.09.2012

malloc() возвращает тип void *. То, что вы возвращаете и сохраняете в этом int, является адресом void *. Это совершенно законно, если, например, вы хотите напечатать адрес памяти, выделенной malloc, перед ее использованием, вы можете:

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;
}

Очевидно, это не имеет большого смысла... но есть причина, по которой при использовании этого кода не возникает ошибка. Что касается предупреждения... ты должен был его получить.

ВС дает:

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 *' 
person Mike    schedule 16.09.2012