scanf中的分段错误

运行此代码时,我在scanf()遇到Segmentation fault。 这可能是由于大型数组的声明(我通过注释数组声明来检查它)。

#include int main() { int test; //int n,ok,counter,i,j; char a[1000][1000]; int x[1000][1000],y[1000][1000]; scanf("%d",&test); printf("%d",test); return 0; } 

既然,我需要那些数组,有人可以建议我如何纠正这段代码。

问题是你在本地定义了一些巨大的对象。 在堆栈上创建局部变量,堆栈有限制(每个线程)。 有时堆栈最大可达1兆字节。 你的数组远不止于此。 我的猜测是你实际上已经溢出了堆栈。 您可以将数组定义移到main之外,程序应该可以正常工作,因为这些数组不会在堆栈上创建。 您还可以通过在main中将它们设置为static来定义数组。 这与在外面声明它们具有相同的效果。

全局定义的变量(包括未初始化的数组)和static未初始化的变量(即使它们在函数中)通常会放在数据段中并在程序运行时进行初始化。 它们也保证设置为全0。这个Wiki引用将C中的这个数据区描述为:

C中的BSS

在C中,没有显式初始值设定项的静态分配对象初始化为零(对于算术类型)或空指针(对于指针类型)。 C的实现通常使用仅由零值位组成的位模式表示零值和空指针值(尽管C标准不要求这样做)。 因此,BSS部分通常包括在文件范围(即,在任何函数之外)声明的所有未初始化变量以及使用static关键字声明的未初始化局部变量。 实现还可以将用仅由零值位组成的值初始化的静态分配变量分配给bss部分。

BSS段不受堆栈限制。 如果资源存在并且您没有超过任何进程配额, BSS可以使用最多可用内存。

另一种方法是使用malloc动态分配数组,这会将它们放在堆上。 以下代码是创建数组的最简单方法。 我使用#define来更清楚地了解行和列。 在定义了这些数组并分配了内存之后,它们可以像任何普通的2D数组一样使用。

 #include #include int main() { #define ROWS 1000 #define COLUMNS 1000 int test; char (*a)[COLUMNS] = malloc(ROWS * sizeof *a); int (*x)[COLUMNS] = malloc(ROWS * sizeof *x); int (*y)[COLUMNS] = malloc(ROWS * sizeof *y); a[100][20] = 'X'; x[4][999] = 666; y[500][0] = 42; scanf("%d",&test); printf("%d",test); free(a); free(x); free(y); return 0; } 

您正在堆栈上分配大量内存,这导致堆栈溢出 你应该在这种情况下使用malloc() ,它会在堆上分配内存。 此外,您需要在使用后free()内存。

这是一个可以使用的示例代码,我只为变量做了a变量,你可以使用xy变量的类似代码:

 #include #include int main() { char **a; int i, j; a = malloc(1000*sizeof(char*)); for(i=0;i<1000;i++) { a[i] = malloc(1000*sizeof(char)); for(j = 0; j < 1000; j++) { //Your operations } } for(i=0; i< 1000; i++) free( a[i]); free(a); return 0; }