2016-05-03 3 views
1

Хотя я знаю, что это не обязательно лучший способ кодирования, я хотел бы инициализировать указатель внутри функции. Затем я могу использовать его позже и удалить его. Он должен выглядеть примерно так:Использование «нового» внутри функции

#include <iostream> 

void initializer(double *d_ptr) 
{ 
    d_ptr = new double; 
} 

int main(int argc, char **argv) 
{ 
    double *my_d; 

    initializer(my_d); 
    *my_d = 2; 
    std::cout << *my_d << std::endl; 

    delete my_d; 
} 

Однако это приводит к нарушениям. Зачем?

+0

@LogicStuff Я знаю, что основная ошибка в том, как передать указатель по ссылке (не понимая, как передать указатель по ссылке), но эти ответы невозможно найти при поиске, как инициализировать указатель внутри функции. Я думаю, что основная ошибка - это дубликат, но этот вопрос не дублируется, потому что аналогичные ответы уже указывают, что вы знаете, что делаете. Этот вопрос касается того, как определить, почему функция не инициализируется должным образом, даже если она компилируется. – Joel

+0

@juanchopanza см. Выше? – Joel

+0

На самом деле ... Я просто прочитал использование stackoverflow дубликатов. Похоже, что это относится к случаю, когда это дубликат, но вопрос не должен быть удален, потому что вопрос уникален, и трудно найти связанные ответы, если у вас есть эта проблема. Правильно ли это звучит? http://stackoverflow.com/help/duplicates – Joel

ответ

3

Проблема заключается в функции. Он получает double *d_ptr. Это означает, что d_ptr является указателем на двойной. Но когда вы делаете:

d_ptr = new double; 

это переназначение указателя d_ptr новый адрес, не влияя на внешний указатель, передаваемый в функцию.

Что мы хотим сделать, это присвоить внешнему указателю новый адрес. Это означает, что когда мы делаем d_ptr = new double;, мы хотим, чтобы d_ptr был ссылкой на внешний указатель. Затем, назначив d_ptr новый адрес, мы назначим внешнему указателю новый адрес. Правильный путь для функции получить указатель:

void initializer(double *&d_ptr) 

Это означает, что функция имеет переменную d_ptr, которая является ссылкой на указатель типа двойных. Один из символов фиксирует все:

#include <iostream> 

void initializer(double *&d_ptr) 
{ 
    d_ptr = new double; 
} 

int main(int argc, char **argv) 
{ 
    double *my_d; 

    initializer(my_d); 
    *my_d = 2; 
    std::cout << *my_d << std::endl; 

    delete my_d; 
} 
+0

Это много объясняет что-то простое. Ваше объяснение ничем не отличается от того, если вы попытались изменить значение любого параметра, переданного функции, и измените это отражение на вызывающего. Вы передаете ссылку на этот тип, и в этом случае тип является указателем, поэтому вы передаете ссылку на указатель. – PaulMcKenzie

+0

[Простой пример с использованием 'int':] (http://ideone.com/zAmV4d) – PaulMcKenzie

+0

Простая ретроспектива, я согласен; просто не в предвидении. Мне потребовалось некоторое время, чтобы подумать с точки зрения указателей, имеющих значения, которые являются адресами. Я думал, передав указатель, он будет скопирован на новый указатель, который я мог бы использовать вместо оригинала. Это не так, как это работает, и для меня определенно не было очевидно, что мне нужна ссылка на указатель и как его кодировать. – Joel

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