C++ 指向C/C+中结构的指针+;

C++ 指向C/C+中结构的指针+;,c++,pointers,data-structures,struct,C++,Pointers,Data Structures,Struct,现在,我知道在内存中的某个点上有一个存储点,p指向那个位置。然而,在这些节点结构中,没有实际的实例,只是在堆上分配内存 它是如何工作的 我将内存分配给堆上的这些指针 “当我使用next->value时,该值存储在哪里?” 正如您提到的,值成员也存储在堆中。sizeof(NODE)语句将确保保留必要的内存 没有实际实例,只是在堆上分配内存 在C++方面,这个语句几乎是正确的,至少这些实例没有正确初始化。虽然保留内存被视为存储了通常的C++实例。 要实现标准C++ +代码>结构 >代码>类初始化,

现在,我知道在内存中的某个点上有一个存储点,p指向那个位置。然而,在这些节点结构中,没有实际的实例,只是在堆上分配内存

它是如何工作的

我将内存分配给堆上的这些指针

“当我使用next->value时,该值存储在哪里?”

正如您提到的,
成员也存储在堆中。
sizeof(NODE)
语句将确保保留必要的内存


没有实际实例,只是在堆上分配内存

在C++方面,这个语句几乎是正确的,至少这些实例没有正确初始化。虽然保留内存被视为存储了通常的C++实例。 要实现标准C++ +代码>结构<代码> >代码>类<代码>初始化,您可以更改< <代码> AdNODE()/<代码>函数如下:

int a; 
int *p;
p=&a;
<代码> > MalCube()>代码>只提供堆上的内存分配,而C++ <代码> NeW()/代码>运算符将确保在内存分配之后,调用任何适当的构造函数(也就是编译器默认创建的构造函数)。对于C++,对于编译器提供的结构/类成员有标准的初始化,除非定义了显式构造函数和成员初始化。 注意:
如果使用
new()
运算符,则必须使用
delete
而不是
free()
来释放分配的内存。与
new()
保证调用构造函数类似,
delete
保证正确调用析构函数


台词

void addNode(NODE *prev) {
    NODE* next = new NODE(); // Use the new() operator for c++ struct/class
              // ^^^^^^^^^^^ // initialization
    // ...
}
无论如何都不会做你期望的事。您应该有某种类型的
LinkedList
struct/class,或者至少有一个固定的
NODE*head
引用,它跟踪分配的内存/实例,并在超出范围时删除它们


您将需要一些由类提供的内存管理。也许你可以直接使用它,而不是酝酿你自己的。

通过你的第二个代码示例,可以理解的是,通常你会用指针指向现有的变量

好了,现在你自己创建它们(使用malloc)。 它们是在内存的另一个称为堆的部分创建的,它们是真正的实例。就像它们在堆栈上是真实的一样。malloc只是“找到”一个空间供您存储它们

链表在堆上看起来像这样:

请注意,链表仅包含:头(8)->3(10)->7(2)->13(14)->5(0)。
此列表不使用堆的其他所有部分


找到图像源。

诀窍在于,
malloc
只分配内存,但不在那里构造对象,
struct node
是一种所谓的POD类型(“POD”代表“普通旧数据”),这意味着,除了其他属性外,它的最小“构造”包括什么都不做

现在,如果你忽略了什么都不做的步骤,当然不会有什么伤害。也就是说,如果你给某个内存位置分配了一个POD类型的值,那么一个POD类型的对象“神奇地”就产生了。事实上,该标准明确允许POD类型使用此功能


关于如何识别豆荚类型的问题:经验法则是,豆荚类型也可以在C中使用。

?您可以在所有
malloc
行上创建节点实例。节点的存储在你的MaloC’d的内存中,为什么当它是C++时标记C?使用C++时,为什么使用<代码> MalOC 可以避免使用新的Malc,并且可以使用Delaby.@ PQNET:实际上它是C++:它是一个需要被标准C++ C++编译器接受的程序。它当然不是好的C++。使用<代码> Malc <代码>免费< /COD>是它的问题之一,是的。这些函数是为了与C兼容而存在的,不应在纯C++代码中使用。另一个问题是使用它们时没有包含适当的头(不要求
iostream
间接包含该头;当我声称需要编译代码时,我没有注意到这个问题,事实上,由于这个问题,它不是)。此外, TyPulfStutsNo结节点在C++中没有意义;由于定义为
struct node
的类型可以称为
node
,因此typedef只是添加了一个多余的名称,而无需添加。非常感谢,我现在已经很清楚了。我认为malloc只是返回一个指向内存位置的指针,不会导致创建任何实例。@chintanshah我看不出这张(令人困惑的)图片如何比我在回答中所说的更好地阐明这一点(特别是它如何显示为解决任何问题应该做些什么),但正如您所愿:P…@πάνταῥεῖ, 谢谢你的回答。我的疑问是,当我使用指向结构的指针时,实际上没有指向结构的指针的实例。这个答案让我明白了malloc确实创建了一个实例,但它是在堆上创建的。我想malloc返回结构的起始地址?@chintansah
malloc()
将起始地址返回到堆上的一块内存,该内存至少保留了足够的空间来存储
节点的有效实例,但与
new()相反
没有对该实例进行初始化。@arnon Zillca放图片看起来很性感,但没有真正解释真正的问题/误解:P。。。
void addNode(NODE *prev) {
    NODE* next = new NODE(); // Use the new() operator for c++ struct/class
              // ^^^^^^^^^^^ // initialization
    // ...
}
free(curr);
free(trav);