Сбой анонимного вызова структуры C ++ - PullRequest
1 голос
/ 28 ноября 2011

Этот код не был выполнен во время выполнения, а не во время компиляции. Я не эксперт в C ++. Любая помощь?

extern void fn();

int main(int argc, char** argv) {
    fn();
}

void fn()
{
    struct Foo{
        string name;
    }*foo;
    foo->name="sleiman";
    cout<<foo->name<<endl;
}

Почему этот код не работает во время выполнения и почему он успешно выполняется, если я создаю статический экземпляр?

void fn()
{
    struct Foo{
        string name;
    }foo;
    foo.name="sleiman";
    cout<<foo.name<<endl;
}

Ответы [ 4 ]

7 голосов
/ 28 ноября 2011

foo сделан указателем, но не инициализирован, поэтому при попытке доступа к имени он читает недопустимую память.Вы инициализируете foo как указатель на структуру Foo, но не говорите ему, чтобы он указывал на реальный объект, так что в действительности это свободный указатель.

Чтобы выполнить эту работу, вам потребуетсяуказатель указывает на реальный объект с помощью ключевого слова new или других средств.

2 голосов
/ 28 ноября 2011

Похоже, в вашем первом примере вы делаете указатель на foo. Тот факт, что вы делаете указатель на foo, не означает, что он на самом деле указывает на объект. Вы должны использовать новый для создания этого объекта. Попробуйте это:

void fn()
{
    struct Foo{
        string name;
    };
    Foo* foo = new Foo;
    foo->name="sleiman";
    cout<<foo->name<<endl;
    delete foo;
}

Убедитесь, что вы удалили его, когда закончили его использовать.

1 голос
/ 28 ноября 2011

Когда вы создаете указатель на X, вы фактически не выделяете X, а ваш указатель указывает где-то в пространстве. Вам нужно либо назначить указатель для указания на уже существующий экземпляр X, либо выделить новый с помощью new X. В противном случае вы получаете доступ к памяти, для которой вы не знаете, для чего она нужна. И это неопределенное поведение, поэтому может произойти все, что угодно.

1 голос
/ 28 ноября 2011
struct Foo{
    string name;
}*foo;

foo просто объявлен как указатель на Foo, но он не указывает на какой-либо реальный объект. Вам нужно создать экземпляр, используя new , и тогда вы сможете получить доступ к его членам. Это больше похоже на

int *ptr;
(*ptr) = 100;   // Can you do this with out ptr pointing to a valid resource ?

Но в другом случае у вас есть сам реальный объект.

...