仅在Linux操作系统上双指针后的段错误

时间:2013-11-18 04:41:50

标签: c++ pointers gcc segmentation-fault

我正在为作业编写代码并遇到了一个我不理解的错误。声明

时出现分段错误
maxWinnerTreeNode** node = new maxWinnerTreeNode*;
maxWinnerTreeNode *current;
for(int i = 1; i <= numNodes; i++){
    current = new maxWinnerTreeNode();
    node[i] = current;
}

基本上我要做的是声明一个treeNode指针数组来初始化一个完整的完整二叉树,我从底部向上创建树。我在Windows操作系统上编写并测试此代码,然后将其提交给在Linux操作系统上测试它的教师。上面的双指针声明在Windows上没有给我任何问题。一旦我在Linux上编译它就会抛出一个seg错误。我在Linux服务器上进行了调试,发现我必须将其声明为

maxWinnerTreeNode** node = new maxWinnerTreeNode*[numNodes];
maxWinnerTreeNode *current;
for(int i = 1; i <= numNodes; i++){
    current = new maxWinnerTreeNode();
    node[i] = current;
}

其中numNodes是我需要初始化这个完整的完整二叉树所需的节点数量(某个幂为2)。所以我的问题是为什么Linux机器抱怨最初不知道第一个指针的大小。我的印象是指针声明是动态创建数组的一种方式。

我正在Windows上运行gcc版本4.8.1。代码在运行gcc 4.6.4时评分的Linux服务器。唯一明显的答案是版本的差异。只是想知道是否有其他人有任何其他想法。

1 个答案:

答案 0 :(得分:1)

maxWinnerTreeNode** node = new maxWinnerTreeNode*;

为一个元素分配内存,所以是的,你需要在这里提供数组大小。如果有人告诉你这是一种动态分配内存的方法,那意味着你可以在运行时确定数组大小,这与静态数组相比,你必须在编译时提供数组大小。但是new new总是需要知道确切的数组大小。这可以在Windows上运行,它被指定为未定义的行为,因此在下一台Windows机器上它也可能崩溃。 如果你想要真正的动态数组,最好使用标准库中的vector。