2

我想读取一个文本文件并将其数据放入二维数组中。此代码适用于像 0 1 1 1 0 1 1 0 1 1 1 1 这样的小文本文件,但会为大文本文件和 648x512 数组提供分段错误。可能是什么问题呢?有什么更好的代码可以做到这一点?

链接到一个大的txt文件:

http://mimoza.marmara.edu.tr/~omer.korcak/courses/CSE246%20-%20Spring2012/squares.txt

#include<stdio.h>

FILE *input;
int x=0, y=0, R=0, C=0,c=0;

int main()
{
    input = fopen("squares.txt", "r");
    C = 512;
    R = 648;
    int M[R][C];

    for(x = 0; x < R; ++x ) {
        for(y = 0; y < C; ++y ) {

            fscanf( input, "%d", &c );
            M[x][y]=c;

        }
    }
}
4

2 回答 2

2

当数组大小很大时,例如: 648x512, M[R][C]用完程序的所有堆栈空间,因此,您会遇到分段错误。

尝试使用动态数组,并记住在使用后释放它。

int** M= new int*[R];
for(int i = 0; i < R; ++i)
    M[i] = new int[C];
于 2013-05-06T21:57:34.517 回答
2

因为你使用了太多的堆栈空间。Main 需要一个足够大的堆栈来容纳 M,这将占用 512x648x(sizeof(int))。假设一个 4 字节的整数,即 1327104 字节仅用于一个变量。根据您的环境,这很多。如果您要使用的内存不止一点,请动态分配它:

int M[] new int[C*R] 或 int M[][] = new int[C][R] (相同的差异,第一个实际上更容易使用)

干杯

于 2013-05-06T22:15:16.180 回答