2016-11-09 37 views
-2

我必须创建一个矩阵,其宽度和高度由写入文件时获得的两个参数决定。但是,在矩阵太大的情况下,我有segmentation fault。我认为可能是因为我以静态的方式创建矩阵,所以我需要动态创建它,但是在这里出现我的问题,因为我不知道该怎么做。 我的代码,现在是这样的:在C++中动态创建一个数组

FILE * fp; 
    unsigned int width=0; 
    unsigned int height=0; 
    //Open the file. argv[4] parameter contains the file 
    fp=fopen (argv[4],"r"); 
    //Go to the last position which indicates the size 
    fseek(fp, 0, SEEK_END); 
    //Return to the start: 
    rewind(fp); 
    //The value of the first 4 bytes represent the width 
    size_t return1 = fread(&width,4,1,fp); 
    //The value of the next 4 bytes represent the height 
    size_t return2 = fread(&height,4,1,fp); 
//Matrix creation 
    if (return1 > 0 && return2 > 0) { 
    unsigned int matrix[width][height]; 
+0

你是怎么设法用'heigth'错字发布代码的?无论如何,开始:1.在C++中用C++做的事情2.用Google – LogicStuff

+0

@LogicStuff编辑。对不起,输入错误 – giorgioW

回答

4

如果您有麻烦搞清楚如何动态地创建阵列,我肯定会建议你使用vector类代替。

向量是动态分配的,并且可以缩放。

std::vector<unsigned int> matrix{width * height}; 

请注意,我制作的矢量是一个维度,因为它在分配矢量时真的简化了很多。

要访问特定的坐标,你可以使用:

matrix.at(w * width + h); 

wh是坐标,h显然应该在范围0 <= h < height

如果您要动态分配数组,您将不得不使用new运算符,然后必须记住使用适当的delete[]运算符进行清理。有应该是一个更好的答案在这里堆栈溢出:How do I declare a 2d array in C++ using new?

基本上它会归结为:

unsigned int** matrix = new unsigned int*[width]; 
for (int w = 0; w < width; ++w) { 
    matrix[w] = new unsigned int[height]; 
} 

那么你就必须要记得再次删除矩阵,使用这样的事情:

for (int w = 0; w < width; ++w) { 
    delete [] matrix[w]; 
} 
delete [] matrix; 

因此,换句话说,我建议您使用vector类。

当然,如果宽度和高度值足够大,即使是vector也可能会失败,这是因为您尝试分配太多内存。如果是这种情况,我认为你应该重新审视你的设计,并重新考虑它是如何制作的。

记住使用载体时包括vector头:

#include <vector> 
+0

使用向量并编译它,我得到这个错误:抛出'std :: out_of_range'实例后终止调用 what():vector :: _ M_range_check:__n(which is 1)> = this-> size()(它是1)' – giorgioW

+0

@giorgioW你对'at'函数的输入是什么? –

+0

这是一个执行错误,抱歉。输入是一个矢量,'width * height'的大小叫做'matrixRed',像这样:'matrixRed.at(i * width + j)= intr;' – giorgioW

2
unsigned int matrix[width][height]; 

这有两个问题。

首先,widthheight不是编译时间常量,这是C++标准对于数组大小所要求的。因此你的程序不合格。您的编译器可能支持将可变长度数组(VLA)作为语言扩展,因此无论如何它可能会与编译器一起工作。其次,可以将VLA存储在堆栈上,并且堆栈空间是有限的。事实上,对于大型阵列,您可以轻松地溢出堆栈。你是对的,你需要动态分配数组。这两者都是因为大小是动态的(假设您希望程序可以与不支持VLA的其他符合标准的编译器一起工作),并且可以防止堆栈溢出。

创建动态数组的最简单方法是std::vector。汤米安徒生更深入地了解如何在他的答案中使用向量。