Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;内存中连续的对象? 我不擅长C++,我现在把一些代码移植到C中。它分配了一大堆这样的对象: o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node)); for(int u=0;u<SIZE;u++){ contObjs[u] = o_list::Node(); nodes[u] = &contObjs[u]; }_C++_C_Arrays_Pointers_Memory - Fatal编程技术网

C++;内存中连续的对象? 我不擅长C++,我现在把一些代码移植到C中。它分配了一大堆这样的对象: o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node)); for(int u=0;u<SIZE;u++){ contObjs[u] = o_list::Node(); nodes[u] = &contObjs[u]; }

C++;内存中连续的对象? 我不擅长C++,我现在把一些代码移植到C中。它分配了一大堆这样的对象: o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node)); for(int u=0;u<SIZE;u++){ contObjs[u] = o_list::Node(); nodes[u] = &contObjs[u]; },c++,c,arrays,pointers,memory,C++,C,Arrays,Pointers,Memory,然后用以下内容填充每个位置: for(int u=0;u<SIZE;u++) nodes[u] = new o_list::Node(); 为了纠正这一点,我尝试malloc第一个数组(指针),然后malloc一个对象数组,然后将指针分配到正确的位置,如下所示: o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*)); o_list::Node** nodes = (o_list::Nod

然后用以下内容填充每个位置:

for(int u=0;u<SIZE;u++)
   nodes[u] = new o_list::Node();
为了纠正这一点,我尝试malloc第一个数组(指针),然后malloc一个对象数组,然后将指针分配到正确的位置,如下所示:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));

o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node));

for(int u=0;u<SIZE;u++){
   contObjs[u] = o_list::Node();
   nodes[u] = &contObjs[u];
}
o_list::Node**nodes=(o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
o_list::Node*contObjs=(o_list::Node*)malloc(SIZE*sizeof(o_list::Node));

对于(intu=0;u,您的思路是正确的,尽管完全去掉第一个数组会更好(如果可以的话)。它可能会涉及程序中其他地方的一些设计更改,所以现在让我们暂且不谈


至于你的分段错误,我能看到的唯一问题是,如果
SIZE
不等于
300000
,你就会越界。为什么不在循环中使用
SIZE

不清楚你为什么需要一个指针数组作为开始

然而,这里有几种方法可以实现您的要求:


o_list::Node objArray[SIZE];
o_列表::节点*ptrArray[SIZE];

对于(int i=0;i < p>我不是C++专家,但是没有一个数组形式的<代码>新< /Cord>),它将分配一个连续的对象数组吗?
MyClass * arrayOfMyClass = new MyClass[5];
现在你可能会说“但我正在将其转换为C,而C没有新的”。这是真的,但C也没有类、运算符重载和复制构造函数。如果你想使用malloc,你需要抓住难点,将你的节点类转换为C结构。原因是
malloc()
不是与
new
等价的C

new
分配内存并构造对象。
malloc
只分配内存。你甚至不能保证它给你的内存是零填充的。在C语言中,你需要提供一个初始化函数来完成构造函数将要做的事情。你的代码的C等价物类似于:

void Node_init(struct Node* aNode)
{
    // Any initialisation you need to do of its members
}

...

struct Node* contObjs = malloc(SIZE * sizeof *contObjs); // or use calloc to get zero filled memory

for(int u=0;u<SIZE;u++) {
   Node_init(&contObjs[u]); // Pass the address of the u'th element
}
void Node_init(结构节点*阳极)
{
//您需要对其成员进行任何初始化
}
...
struct Node*contObjs=malloc(SIZE*sizeof*contObjs);//或使用calloc获取零填充内存

对于(int u=0;UU似乎不需要一组指针。为什么不简单地分配一个对象数组?@ BaMuMigGuy我想把它移植到C……我发现这个问题有点不清楚。是关于从C++移植到C还是分配一个毗邻的内存区域?@ JeremyP:“寻求调试帮助的问题必须包括所需的行为、特定的问题或错误以及重现这些问题或错误所需的最短代码”。此处没有足够的信息来猜测丢失的代码可能有什么问题。问题唯一可回答的部分(“数组是否连续?”)杰里米普:我的意思是与这个问题的大部分相比微不足道(以及微不足道的googlable)-只回答这一部分,而忽略主要问题,对任何人都没有多大帮助。我和其他人确实要求提供进一步的信息,但没有提供;因此我投票决定关闭,原因是我在上面引用的原因,它准确地描述了情况。如果你觉得势利,很抱歉,但删除无法回答的问题是本网站维护我的方式ts quality.Nick catch,但大小确实是=300000。抱歉,catch.Edited为+1。@a3mlord:那么我将要求您提交一份报告,因为这是完全无法回答的。我还建议抽象掉代码移植业务,因为它似乎与您的segfault不太相关。
o_list::Node*  objArray = malloc(SIZE*sizeof(o_list::Node));
o_list::Node** ptrArray = malloc(SIZE*sizeof(o_list::Node*));

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;
MyClass * arrayOfMyClass = new MyClass[5];
void Node_init(struct Node* aNode)
{
    // Any initialisation you need to do of its members
}

...

struct Node* contObjs = malloc(SIZE * sizeof *contObjs); // or use calloc to get zero filled memory

for(int u=0;u<SIZE;u++) {
   Node_init(&contObjs[u]); // Pass the address of the u'th element
}