2014-02-18 3 views
0

Если создать узел, как показано нижеУказатель внутри указателя узла

struct node 
{ 
    char *ptr = (char *)malloc(sizeof(char)); 
}*current; 
void main() 
{ 
    node *temp = new node(); 
    current = temp; 
} 

будет выше код автоматически устанавливается current->ptr, чтобы указать, где temp->ptr указывает?

+2

Это полностью недействительный код на C++. Прогоните его через компилятор со строгими предупреждениями и проверкой ошибок и обновите свой вопрос с помощью исправленного кода. –

+0

Ваш код не будет делать ничего из этого, потому что он не будет компилироваться. – dasblinkenlight

+0

Ой, извините, ошибся. отредактировано сейчас! –

ответ

0

Да, current->ptr и temp->ptr ссылки на тот же адрес памяти. Когда вы создаете экземпляр объекта узла через node* temp = new node(), ваш указатель температуры указывает на вновь выделенное хранилище. Назначение указателя current через current = temp будет просто указывать текущую точку на эту ячейку памяти. Обратите внимание, что объект, на который указывает current, по-прежнему существует в другом месте в памяти (вместе с массивом символов MAX), поскольку мы не освободили эту память.Кроме того, назначение указателя не копирует объект - оно просто указывает точку указателя на другую ячейку памяти. Ссылка на любой элемент объектов, на которые указывают current и temp, фактически возвращает те же значения - будь то указатели или другие типы.

Ваш код в данный момент недействителен и не компилируется. Это фиксированная версия того, что вы намерены делать.

#include<cstdlib> 
#include<cstdio> 

#define MAX 10 

struct node 
{ 
     char* ptr; 
     node() 
     { 
      ptr = new char[MAX]; // Do not use malloc if using new elsewhere. 
     } 

}*current; 

int main() 
{ 
    struct node* temp = new struct node(); 
    current = temp; 

    // The pointer addresses will be the same. 
    printf("Current->ptr=%p, temp->ptr=%p\n", (void*)current->ptr, (void*)temp->ptr); 
    return 0; 
} 
+0

Точность ответа на это лучше. (У) –

3
struct node 
{ 
    char *ptr = (char *)malloc(sizeof(char)); // INVALID 
} *current; 

Прежде всего, вы не должны смешивать модели памяти. Если вы используете new, придерживайтесь new. Не отскакивайте между new и malloc.

Во-вторых, это недопустимо C++. Вы не можете объявить члена класса и вызвать функцию для ее инициализации в объявлении (если вы не используете новые возможности C++ 11). Обновление его, чтобы очистить его вверх будет выглядеть примерно так:

struct node 
{ 
    char* ptr; // declare the pointer 
    node() : ptr(new char) { } // initialize the pointer in the constructor 
    // NOTE: should also add a copy constructor and copy-assignment operator here 
    ~node() 
    { 
     delete ptr; // free the memory in the destructor 
    } 
}; 

int main() // NOTE that main must return an int, not void 
{ 
    node current = new node(); 
    node temp = *current; // will do a shallow copy 
    // ... 
    delete current; 
    // PROBLEM - temp now has a dangling pointer! 
    return 0; 
} 

отметить также, что нет никаких причин, почему ptr должен быть указателем в этом случае. Так как вы только динамически выделять один char, вы можете просто использовать автоматический:

struct node 
{ 
    char data; 
    node() : data('\0') { } 
}; 

int main() 
{ 
    node current; 
    node temp = current; // temp now has a copy of data, no problems 
    return 0; 
} 

будет выше код автоматически устанавливается current-> PTR к точке, где TEMP-> PTR наведен

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

+0

В моем фактическом коде мне нужно выделить 'max * sizeof (char)' memory, поэтому для меня обязательно использовать malloc. –

+0

@SrujanBarai 'sizeof (char)' гарантированно будет всегда 1. Нет причин когда-либо использовать 'malloc' вместо' new' (за исключением случаев взаимодействия с очень плохо разработанными устаревшими библиотеками), и в современных C++ нет причин используйте 'новый', даже. –

+0

@SrujanBarai 'char * data = new char [max]' - Если это не для домашней работы, когда профессор говорит вам использовать 'malloc' (по какой-то странной причине), вам не нужно использовать' malloc' для этого , –

1

Токовые и временные ссылки на одно и то же место в памяти. поэтому на самом деле current-> ptr is temp-> ptr.

+0

Фактически, когда я выполняю свой код, 'current-> ptr' не меняет свою ссылку, когда меняю ссылку на' current'. –

1

После этого заявления, где оператор присваивания используется

current = temp; 

тока и температуры будет иметь такое же значение. Это значение является адресом объекта узла типа, где он был выделен. Таким образом, оба указателя указывают на ту же память, что и объект. Сам объект не был скопирован или перемещен.

Оператор new возвращает адрес памяти, в которой он выделил объект, а не сам объект. Так что после этого заявления

node *temp = new node(); 

переменной температуры будет иметь этот адрес и после

current = temp; 

оба тока и температуры будет хранить этот адрес.

+0

Что происходит с моим кодом, когда я делаю current = temp и добавляю значения в * current-> ptr, 'current-> ptr' по-прежнему ссылается на старый узел вместо обращения к temp. Это меня совершенно сбило с толку. –

+0

Обе переменные относятся к одному и тому же узлу. Итак * current-> ptr = 'A'; эквивалентно * temp-> ptr = 'A'; темп и ток имеют одинаковое значение, –

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