我正在为作业编写代码,遇到了我不理解的错误。声明时出现细分错误

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


基本上,我想做的是声明一个treeNode指针数组,以初始化一个完整的完整二叉树,在此我从下往上创建树。我在Windows OS上编写和测试此代码,然后将其提交给在Linux OS上对其进行测试的讲师。上面的双指针声明在Windows上没有任何问题。我在Linux上编译后,立即抛出段错误。我在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。代码在Linux服务器上运行gcc 4.6.4分级。唯一明显的答案是版本不同。只是想知道是否还有其他想法。

最佳答案

这个

maxWinnerTreeNode** node = new maxWinnerTreeNode*;


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

关于c++ - 仅在Linux OS上双指针后分段故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20040226/

10-08 20:47