当我尝试分配4D阵列时,为什么会出现分段错误(核心转储)?

时间:2009-03-12 06:25:59

标签: c++ dynamic matrix segmentation-fault

我正在尝试分配一个大的4D矩阵,但我想动态地做。当我刚刚创建静态矩阵时,一切正常,所以我知道我现在有足够的内存。然而,当我尝试动态地实现相同的东西时,每当我进入第三维时我都会破坏,我需要达到第四个维度!谁能告诉我为什么这段代码不起作用?

#include <iostream>

using namespace std;

static const int time1 = 7;
static const int tlat = 15;
static const int tlon = 17;
static const int outlev = 3;  

int main(void)
{
    //allocate four dimensional dataIn
    int ****dataIn;
    dataIn = new int ***[time1];
    if (dataIn == NULL) { return 1; }

    for(int i = 0 ; i < time1 ; i++) { 
        dataIn[i] = new int **[tlat];
        if (dataIn[i] == NULL) { return 1; }

        for(int j = 0 ; j < tlat ; j++) {
            dataIn[i][j] = new int *[tlon];
            if (dataIn[i][j] == NULL) { return 1; }

            for(int k = 0 ; k < tlon ; k++) {
                dataIn[i][j][k] = new int[outlev];
                if (dataIn[i][j][k] == NULL) { return 1; }
            }
        }
    }
    //there is more code that happens here to add values to dataIn
    //and eventually output it but I know all of that works        
    return 0;
}

我在这段代码上尝试了很多不同的变体,甚至使用了malloc而不是new,但是我无法使用它。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:2)

你是否在调试器中运行它?在我看来,代码看起来很好,但是调试器会告诉你崩溃的位置,这可能足以帮助你修复它

答案 1 :(得分:2)

你可能最好在平面阵列中分配所有内存,然后自己计算索引。将整个事物包装在一个对象中进行封装。

class Matrix {
private:
        int* data;        
        int[] sizes;
        int nDimensions;

public:
        // allocates the data pointer and copies the other parameters
        Matrix(int[] sizes, int nDimensions); 

        // frees the data and sizes arrays
        ~Matrix();

        // calculates the cell position and returns it
        int getCell(int[] coordinates);

        // calcultes the cell position and sets its value
        void setCell(int[] coordinates, int value);

private:
        // used by getCell and setCell, calculates the cell's 
        // location in the data array
        size_t calculateCellPosition(int[] coordinates);
};

答案 2 :(得分:1)

它在我的Linux机器上编译并运行良好。

BTW,使用标准C ++时,new会在无法分配内存时抛出std :: bad_alloc异常(而不是返回NULL)。因此,可能值得捕获该异常而不是测试NULL指针。

答案 3 :(得分:0)

正如cmeerw所指出的那样,在std-c ++中不需要对NULL或0进行测试。

如果您可以将评论添加到您获得segv的确切位置,将会有所帮助。

另外:您使用的是哪种编译器以及哪种操作系统?

答案 4 :(得分:0)

签出boost::multiarray,它完全符合您的要求,除了通过单一堆分配更有效率。