2015-06-10 3 views
-5

Вот мой код:Указывает ли язык C какую-либо неявную инициализацию только для указателей void?

int main() 
{ 
    int *p; 
    void *x; 
    printf("%p\n", p); 
    printf("%p\n", x); 
    return 0; 
} 

, который будет печатать:

koraytugay $ ./a.out
0x7fff53b35ad0
0x0
koraytugay $ ./a.out
0x7fff5803fad0
0x0
koraytugay $ ./a.out
0x7fff512c9ad0
0x0
koraytugay $ ./a.out
0x7fff55213ad0
0x0
koraytugay $ ./a.out
0x7fff52dbdad0
0х0

Есть ли объяснение этому поведению в языке?

+6

'p' и' x' - неинициализированные переменные, а стандарт говорит, что использование неинициализированных переменных приводит к неопределенному поведению.Код не имеет смысла печатать неинициализированные переменные – Gopi

+3

Нет. Никаких объяснений с определением. Ваш код вызывает неопределенное поведение. Вы оцениваете * неопределенные * переменные в * обоих * случаях. – WhozCraig

+0

Неопределенное поведение. Каков твой вопрос? – LPs

ответ

6

Я думаю, что стандарт C11 совершенно ясен в этом отношении. Обращаясь к пункту 6.7.9 раздела 6.7.9,

Если объект с автоматической продолжительностью хранения не инициализирован явно, его значение является неопределенным.

Теперь, значение неопределенными, ну, неопределенными (который вы имеете в виду как мусор и/или NULL здесь). Вы не можете знать, что там будет.


EDIT:

Просто для уточнения, в соответствии с замечанием,

"Но void *p кажется, NULL всегда"

Правильно. Это похоже. Ничего не гарантировано (указано), поскольку считается, что стандарт C.

Только примечание: Предпочитаемый int main(void) над int main(). Первый рекомендуется.

+0

Но void * p кажется NULL всегда. –

+0

@ KorayTugay может быть, но C ничего не говорит об этом. Возможно, расширение компилятора (просто гадание). –

+2

Неопределенные средства, вы * не можете зависеть от этого *, а не случайные. Это зависит от компилятора. – meskobalazs

6

Вы спросили:

В C, поэтому является недействительным указатель NULL при объявлении, но другие типы содержат мусор?

Это ошибочный вывод с использованием небольшой программы. Неинициализированные указатели в области функций получают случайные значения. Вы не можете полагаться на какой-либо шаблон в своих значениях.

+0

Ну, указатель void кажется NULL все время. –

+1

@KorayTugay хорошо, что это происходит в вашей системе с вашей программой, не означает, что это всегда произойдет в любом случае с любыми системами с любыми компиляторами –

+0

@KorayTugay Измените порядок своих утверждений печати - в зависимости от вашей среды вы можете получить впечатление, что int указатели всегда NULL "(которые они не являются, они просто ** неинициализированы **) –