2017-02-20 6 views
-4

Кто-нибудь знает, как правильно выписать строку кода, где эта программа сработает?
Я обнаружил, что это вызвано, пытаясь присвоить значение ячейки памяти Нулевой, но я борюсь, как писать правильно:Проблемы с указателями на C++

#include <cstdlib> 
int position[10]; 

struct ONE { 
    int* ptr; 
}; 

int* f(int x) { 
    return position + x; 
} 

int main() { 
    ONE * main_ptr = NULL; 
    main_ptr->ptr = f(4); // <-- crash 
    return 0; 
} 

Я был бы очень признателен, если кто-то может найти из-за проблемы и помочь мне

+2

Название языка C++ не Cpp («каст» часто относится к C препроцессором). Когда программа прерывается, ее обычно называют «крахом», а не «раздавливанием». Фраза «двойной указатель» может относиться к типу 'double *'. Я бы предложил использовать фразу «указатель на указатель», но это не совсем то, что у вас здесь; 'main_ptr' является указателем на структуру, содержащую указатель. –

+0

Нет таких вещей, как «двойные указатели». Есть указатели на указатели. И это «сбой», а не «раздавить». –

ответ

0

Очевидно, что main_ptr не является выводом, поскольку он является нулевым. Чтобы разыменовать указатель, указатель должен указывать на объект. Один из способов это исправить:

ONE one; 
ONE * main_ptr = &one; 

// as before 

Можно также выделить объект динамически (с помощью <memory>):

std::unique_ptr<ONE> p_one = std::make_unique<ONE>(); 
ONE * main_ptr = p_one.get(); 

// as before 
+0

[demo] (https://ideone.com/1BNoWQ), [альтернативное демо] (https://ideone.com/KEayD2). –

+0

Ничего себе, спасибо за ответ! Я этого не знал. Спасибо! –

Смежные вопросы