C对象在内存中是连续的吗?

我不是很擅长C,我目前将一些代码移植到C.它分配了一大堆对象,如下所示:

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

然后填写每个职位:

for(int u=0;u<SIZE;u++)
   nodes[u] = new o_list::Node();

根据我的理解,我们对有关内存的唯一保证是指向对象的指针实际上是连续的,即它可能发生在我们有:

 _____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
 |   \ \         
 |    \ \______
 |     \       \
 O      O       O       -> not contiguous positions of objects;

为了纠正这个问题,我尝试了第一个数组(指针),然后malloc一个对象数组,然后将指针指向正确的位置,如下所示:

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

但这会导致分段错误.我想知道我的假设是否正确以及为什么我在第二个选项中出现分段错误.

谢谢

最佳答案 你是在正确的路线,虽然完全摆脱第一个阵列会更好(如果可以的话).它可能涉及程序中其他地方的一些设计更改,所以让我们暂时离开.

至于你的分段错误,我能看到的唯一问题是如果SIZE不等于300000,你将超出界限.为什么不在循环中使用SIZE?

点赞