【问题标题】:Seg Fault after Double Pointer only on Linux OS双指针后的段错误仅在 Linux 操作系统上
【发布时间】:2013-11-18 04:41:50
【问题描述】:

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

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

基本上我想做的是声明一个treeNode指针数组来初始化一个完整的二叉树,我从下到上创建树。我在 Windows 操作系统上编写和测试此代码,然后将其提交给在 Linux 操作系统上测试它的讲师。上面的双指针声明在 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。唯一明显的答案是版本的不同。只是想知道是否其他人有任何其他想法。

【问题讨论】:

    标签: c++ pointers gcc segmentation-fault


    【解决方案1】:

    这个

    maxWinnerTreeNode** node = new maxWinnerTreeNode*;
    

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

    【讨论】:

      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多