2015-06-04 4 views
0

Я написал простую программу ниже:печати глобальный указатель дает CoreDump

#include <stdio.h> 

unsigned int *time = 0; 
int main(){ 
    printf("time = %u\n", *time); 
    return 0; 
} 

Это будет дает мне сегментация вину на x86-64. Может ли кто-нибудь объяснить первопричину?

+0

** Неопределенное поведение ** !! – haccks

+0

Но я думал, что инициализирую значение равным 0. Не могли бы вы более подробно объяснить основную причину? – drdot

+4

Вы пытаетесь разыменовать указатель «NULL». – EOF

ответ

3

Как упоминают некоторые комментарии, вы разыскиваете указатель, указывающий на область памяти, которой она не должна быть.

unsigned int *time = 0; 

объявляет указатель на целое число без знака, а память адресу она указывает на это адрес 0x0. Затем вы разыгрываете этот указатель, что является проблемой, потому что вы просите прочитать содержимое по адресу 0x0, что приводит к ошибке сегментации. Возможно, если вы подробнее расскажете о том, что вы пытаетесь сделать, мы могли бы дать вам дополнительную информацию о том, как действовать дальше, но я не совсем уверен, что вы собираетесь с этой программой.

+0

Нулевой указатель не * обязательно * адрес '0x0'. Он представлен как «0» (или, более ясно, «NULL») в исходном коде, и он очень часто реализуется как all-bits-zero, но, что касается стандарта C, это просто указатель, который не указывает на что угодно. –

+0

Достаточно справедливо, редактирование сделано ... – Matt

+0

Я хочу инициализировать указатель на 0. Я думаю, что я сделал неправильный путь. Один правильный путь: 'unsigned int a = 0; unsigned int * time = & a; ', правильно? – drdot