Почему такое поведение при объявлении указателей в C ++ с использованием систем Unix и Windows?

0

Я не нашел этот вопрос в Qaru или Google, так что извините, если это дубликат.

Как я знаю, переменные в C/C++ не инициализируются. Но в последнее время странная ситуация возникает при использовании указателей. См. Следующий код:

#include <iostream>

using namespace std;

struct Test {
    int i;
};

struct Box{
    Test *var;
};

int main() {
    Box *t = new Box;
    cout << t->var;
}

В Windows выход, который я получаю, похож на (что ожидается):

0x3e0178

Но в Unix-системах вывод:

0x0

Почему это происходит? Является ли компилятор инициализацией указателей рекурсивным способом, когда new вызывается в Unix-системах?

Кроме того, с общими переменными происходит то же самое. Для приведенного ниже кода результаты равны 0 в Unix-системах и 4385838 в Windows:

int main() {
    int i;
    cout << i << endl;
}

ОБНОВИТЬ

В другом тесте поведение на этот раз было одинаковым в обеих системах: указатель p указывает на случайный адрес в памяти.

int main() {
    int *p;
    cout << p;
}

Чтобы объяснить мой вопрос: я знаю, что мы должны инициализировать переменные перед его использованием, но студент спрашивал меня, почему его программа отлично работает в Unix-системах, а не в Windows. Я нашел эту проблему с указателем в своей программе, и я хочу дать обратную связь.

  • 2
    Этот член никогда не был ни инициализирован, ни назначен. Как таковая, даже оценка этого вызывает неопределенное поведение . Аналогично со i во втором фрагменте.
  • 0
    Итак, когда это оценивается, используется ли тип поведения по умолчанию ?
Показать ещё 4 комментария
Теги:
pointers

1 ответ

2
Лучший ответ

Во всех современных (многопользовательских) операционных системах память, полученная непосредственно из os, обнуляется, чтобы избежать утечки информации. Что происходит, возможно, это системы Unix, потому что для настройки надлежащей среды выполнения C, а также main() помощью немой удаленной полученной девственной памяти, необходимо запустить гораздо меньше кода запуска, а не повторно использовать пространство стека, ранее использовавшееся для другой функции, для хранения i, Другое возможное объяснение заключается в том, что кто-то просто сохранил там 0.

Во всяком случае, не полагайтесь на это ради небес.

  • 0
    Я думал о том же: системы Unix, по счастливой случайности (как вы сказали), заполняют нули в памяти для программы на Си (или, возможно, заполняют нулями любые неинициализированные переменные). Но если я напишу новую программу, объявив int *p; и в следующей строке cout << p вывод такой же, как в Windows: случайный адрес в памяти.
  • 1
    Да, не стоит на это полагаться. Но AFAICR, линукс обнуляет блоки перед передачей их для sbrk (), так что первые новые придет все-обнуленных ... :) , но не полагаться на нее , потому что следующие ассигнования осуществляются внутри процесса , и они придут с мусором на них.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню