【问题标题】:C -multidimensional array causes Segmentation Fault (GCC)C -多维数组导致分段错误(GCC)
【发布时间】:2010-12-18 19:03:17
【问题描述】:

如果我更改数组的一个维度的大小,为什么会出现运行时错误:“分段错误?”。示例:

#include <stdio.h>
#define DIM 8 
int main(int argc, char **argv)
{
    int a[3][3][3][3][3][3][3][3][3][3][DIM],
        b;
    a[1][1][1][1][1][1][1][1][1][1][1] = 2;
    b=a[1][1][1][1][1][1][1][1][1][1][1];
    printf("%d \n",b);
    return 0;
}

如果 DIM 为 8,则不会产生运行时错误,但如果 DIM 大于 8,则会导致运行时错误“Segmentation Fault”。为什么???

【问题讨论】:

    标签: c arrays gcc


    【解决方案1】:

    几乎可以肯定是堆栈溢出。您正在分配什么,3 ^ 10 * 9 * sizeof(int) 字节!请改用int *a = (int*)malloc(N * sizeof(int)),其中 N 是您想要的整数数。然后就可以在上面模拟一个N维数组了。

    我将解释如何在 1D 数组上模拟 2D 数组。假设它的行宽为 10。然后通过 a[10 * 2 + 5] 访问第三行的第 5 个值。一般来说,你会使用a[width * (row - 1) + column]。

    第二种方法。你可以分配一个指针数组到整数指针:

    int **a = (int**)malloc(rows * sizeof(int*))
    for (int i=0; i<row; ++i)
        a[i] = (int*)malloc(columns * sizeof(int))
    

    ...将其扩展到更多维度,留给读者练习。

    【讨论】:

    • 但是我需要 11 维数组并且 C 没有 new[] 操作数
    • 你的意思是使用 malloc() - 这是一个 C 问题,而不是 C++。
    • @Ant:抱歉,已修复。 @Norma:你为什么首先需要它?!你可以模拟它(我会添加它),或者使用int*******...但说真的,你可能有一个设计缺陷。
    【解决方案2】:

    数组的大小是 3^10 * 8 * sizeof(int)。假设一个 32 位 int,sizeof(int) 是四个字节,你的数组的大小是:

    3^10 * 8 * 4 = 1,889,568 bytes
    

    所以你的堆栈不是那么大,你正在溢出堆栈。

    【讨论】:

      【解决方案3】:
      3*3*3*3*3*3*3*3*3*3*8 = 472392; 472392*4 /* sizeof (int) */ = 1889568 3*3*3*3*3*3*3*3*3*3*9 = 531441; 531441*4 /* sizeof (int) */ = 2125764

      我猜你的堆栈限制为 2Mbytes

      【讨论】:

        猜你喜欢
        • 2015-06-20
        • 2012-02-25
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多