Глобальные указатели вызывают ошибку сегментации? - PullRequest
4 голосов
/ 12 июля 2010

При компиляции gcc и последующем запуске код

    int *p;
    int main() {*p = 1;}

вызывает ошибку сегментации.

По-видимому, в ячейку памяти, содержащуюся в p, нельзя записать.1007 * Почему ????

С другой стороны,

    int q[];
    int main() {*q = 1;}

работает нормально.

Что здесь происходит?

Почему p содержит только постоянную память?

Ответы [ 3 ]

10 голосов
/ 12 июля 2010

Первый пример имеет дикий (не инициализированный явно) указатель. Поскольку это не автоматическая переменная, она установлена ​​в 0, что явно не является вашей памятью. Вы можете увидеть это, распечатав это с помощью:

printf("%p\n", p)

Что касается второго, C99 §6.9.2 фактически приводит это в качестве примера:

ПРИМЕР 2 Если в конце блок перевода, содержащий

int i [];

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

Обычно объекты с предварительным определением (без инициализатора) инициализируются с 0, что для массива означает массив из 1 элемента со значением элемента 0.

3 голосов
/ 12 июля 2010

*p = 1; вызывает ошибку сегментации, поскольку до назначения не было выделено ни одной памяти.

*q = 1; работает, потому что компилятор (gcc 4.2.1 в Mac OS X) предупреждает, что предполагается, что q [] имеет один элемент.

0 голосов
/ 12 июля 2010

Ваш первый пример вызывает ошибку сегментации, потому что вы разыменовываете NULL.Вы никогда не инициализируете p значением, а , потому что это глобальное , оно будет NULL.Таким образом, вы разыменовываете NULL и boom.

Я не уверен, насколько правомерен второй пример - gcc отмечает, что он принимает q как массив из 1 элемента, поэтому он победил 'взорвать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...