Я не нашел этот вопрос в 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. Я нашел эту проблему с указателем в своей программе, и я хочу дать обратную связь.
Во всех современных (многопользовательских) операционных системах память, полученная непосредственно из os, обнуляется, чтобы избежать утечки информации. Что происходит, возможно, это системы Unix, потому что для настройки надлежащей среды выполнения C, а также main()
помощью немой удаленной полученной девственной памяти, необходимо запустить гораздо меньше кода запуска, а не повторно использовать пространство стека, ранее использовавшееся для другой функции, для хранения i, Другое возможное объяснение заключается в том, что кто-то просто сохранил там 0.
Во всяком случае, не полагайтесь на это ради небес.
int *p;
и в следующей строке cout << p
вывод такой же, как в Windows: случайный адрес в памяти.
i
во втором фрагменте.