#include <iostream>
#include <string>
using namespace std;
struct Bar {
string str;
};
struct Foo {
Bar* bar;
};
int main() {
Foo foo;
if (true) {
Bar bar;
bar.str = "test";
foo.bar = &bar; // version 1
// *(foo.bar) = bar; // version 2
}
cout << foo.bar->str << endl;
return 0;
}
Вышеупомянутая программа ничего не печатает. Я понимаю, что когда оператор if выходит, переменная строка, которая была выделена в стеке, больше не существует, а foo.bar содержит указатель на неопределенное расположение памяти в стеке. Я не понимаю, что когда я меняю строку на текущую прокомментированную строку (отмеченную версией 2). Это дает мне ошибку сегментации. Может ли кто-нибудь помочь мне понять, почему это так? Кроме того, если я хочу напечатать «тест» для этой программы, какие изменения кода я должен сделать?переменная область действия и указатель
Но почему int * a; * А = 1; работает? из-за примитивного типа? – pippo
@pippo, это также является причиной неопределенного поведения. –
Нет, int * a; * А = 1; так же плохо. Однако возможно, что случайно вы нашли действительный адрес памяти. – Marandil