指针内的节点指针

时间:2014-02-18 19:59:39

标签: c++ pointers data-structures malloc nodes

如果我按以下方式创建节点

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

以上代码会自动将current->ptr设置为指向temp->ptr指向的位置吗?

4 个答案:

答案 0 :(得分:3)

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

首先,你不应该混合使用内存模型。如果您使用的是new,请坚持使用new。请勿在{{1​​}}和new之间跳转。

其次,这不是有效的C ++。您不能声明一个类成员并调用一个函数来在声明中初始化它(除非您使用的是C ++ 11的新功能)。更新它以清理它看起来像:

malloc

另请注意,在这种情况下,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
  

上面的代码会自动将current-> ptr设置为指向哪里   temp-> ptr指向

您拥有的代码甚至无法编译,但如果您进行了修复,则默认的复制赋值运算符将执行浅拷贝。在使用指针的情况下,这意味着您有两个指向同一内存位置的对象。因为他们都假设他们拥有它,当其中一个人摧毁它时,另一个人留下一个悬垂的指针。

答案 1 :(得分:1)

当前和临时参考记忆中的同一个地方。所以实际上current-> ptr temp-> ptr。

答案 2 :(得分:1)

在此语句之后使用赋值运算符

current = temp;

current和temp将具有相同的值。此值是分配它的节点类型对象的地址。因此,两个指针指向对象占用的相同内存。对象本身未被复制或移动。

Operator new返回分配对象而不是对象本身的内存地址。所以在这个声明之后

node *temp = new node();

变量temp将具有此地址并且在

之后
current = temp;

current和temp都将存储此地址。

答案 3 :(得分:0)

是的,current->ptrtemp->ptr指的是相同的内存地址。通过node* temp = new node()实例化节点对象时,临时指针指向新分配的存储。通过current分配current = temp指针只会使当前指向该内存位置。请注意,current指向的对象仍然存在于内存中的其他位置(以及MAX大小的字符数组),因为我们还没有释放该内存。此外,指针赋值不会复制对象 - 它只是使指针指向不同的内存位置。实际上,引用currenttemp指向的对象的任何成员将返回相同的值 - 无论它们是指针还是其他类型。

您的代码目前无效,无法编译。这是您打算做的固定版本。

#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;
}