a3m*_*ord 5 c c++ memory arrays pointers
我不太擅长C ++,目前正在将一些代码移植到C中。它分配了很多这样的对象:
o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
Run Code Online (Sandbox Code Playgroud)
然后在每个职位上填写:
for(int u=0;u<SIZE;u++)
nodes[u] = new o_list::Node();
Run Code Online (Sandbox Code Playgroud)
据我了解,关于连续内存的唯一保证是指向对象的指针实际上是连续的,也就是说,可能发生以下情况:
_____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
| \ \
| \ \______
| \ \
O O O -> not contiguous positions of objects;
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我尝试先分配第一个数组(指针),然后再分配一个对象数组,然后将指针分配到正确的位置,如下所示:
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];
}
Run Code Online (Sandbox Code Playgroud)
但这会导致分段错误。我想知道我的假设是否正确,以及为什么第二个选项中存在细分错误。
谢谢
你是对的,尽管完全摆脱第一个数组会更好(如果可以的话)。它可能涉及程序中其他地方的一些设计更改,所以让我们暂时保留它。
至于你的分段错误,我能看到的唯一问题是如果SIZE不等于300000,你就会出界。SIZE为什么不在循环中使用?