Динамическое выделение памяти для целочисленного указателя - PullRequest
0 голосов
/ 30 января 2019

У меня есть запрос относительно динамического выделения памяти целочисленного указателя.

    int main()
    {
        int *a;
        *a = 5;
        printf("value = %d\n", *a);
        return 0;
    }

Насколько я понимаю, приведенный выше фрагмент кода должен возвращать ошибку сегментации, которая происходит в моем ПК (Ubuntu 32bit).

Но один и тот же фрагмент кода, когда он выполняется на моем MacOS и в системе Fedora Linux, выводит как "значение = 5".Есть идеи, почему этот код работает на этих двух системах, даже если я не выделил память для целочисленного указателя?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

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

Неинициализированный указатель может указывать на некоторую память, которую вы можете читать и записывать.Запись по этому адресу может изменить несвязанные данные или может изменить машинный код вашей программы и позже может привести к сбою или странному поведению.Поведение не определено и может измениться при изменении несвязанных частей вашей программы.

Чтобы проверить наличие проблем такого типа, вы можете использовать такие инструменты, как valgrind.

0 голосов
/ 30 января 2019

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

Вот почему он «работает» в одной системе, но в другой - падает.То, что вы делаете что-то, что может вызвать сбой, не означает, что будет .

0 голосов
/ 30 января 2019

Я думаю, что каждый раз, когда вам приходится иметь дело с памятью, как работает ваш фрагмент кода, вы вступаете на территорию неопределенного поведения.Ваш указатель мог быть случайно инициализирован в допустимую ячейку памяти, и поэтому задание будет работать.Если вы хотите проверить 100% вероятность сбоя, вы должны инициализировать a до NULL.

...