scanf中的分段错误

scanf中的分段错误,c,C,运行此代码时,我在scanf()处遇到分段错误。这可能是由于声明了大型数组(我通过注释数组声明进行了检查) #包括 int main() { 智力测验; //int n,ok,counter,i,j; 字符a[1000][1000]; int x[1000][1000],y[1000][1000]; 扫描频率(“%d”和测试); printf(“%d”,测试); 返回0; } 由于我需要这些数组,有人能建议我如何更正此代码吗。您正在堆栈上分配大量内存,这导致您应该使用malloc()对于这种情

运行此代码时,我在scanf()处遇到分段错误。这可能是由于声明了大型数组(我通过注释数组声明进行了检查)

#包括
int main()
{
智力测验;
//int n,ok,counter,i,j;
字符a[1000][1000];
int x[1000][1000],y[1000][1000];
扫描频率(“%d”和测试);
printf(“%d”,测试);
返回0;
}

由于我需要这些数组,有人能建议我如何更正此代码吗。

您正在堆栈上分配大量内存,这导致您应该使用
malloc()
对于这种情况,它将在堆上分配内存。使用后,您还需要
释放()
内存

这是一个您可以使用的示例代码,我只为
a
变量使用了它。您可以为
x
y
变量使用类似的代码:

#include<stdio.h>
#include<stdlib.h>
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;
}
#包括
#包括
int main()
{
字符**a;
int i,j;
a=malloc(1000*sizeof(char*);

对于(i=0;i而言,问题在于您正在本地定义一些大型对象。本地变量在堆栈上创建,并且堆栈具有限制(每个线程)。有时堆栈的最大值可能为1 MB。您的数组可能远远超出此值。我猜您实际上是溢出了堆栈。您可以将数组定义移到main之外,并且您的程序应该可以工作,因为这些数组不会在堆栈上创建。您也可以通过将数组设置为
静态
,来定义数组
main
。这与在外部声明它们具有相同的效果

全局定义的变量(包括未初始化的数组)和
静态
未初始化的变量(即使它们在函数中)通常放置在数据段中,并在程序运行时初始化。它们还保证设置为所有0。这在C中描述了此数据区域:

C语言中的BSS

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

BSS
段不像堆栈那样受到约束。
BSS
如果资源存在且未超过任何进程配额,则可能会占用最多可用内存

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

#include<stdio.h>
#include<stdlib.h>
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;
}
#包括
#包括
int main()
{
#定义第1000行
#定义第1000列
智力测验;
char(*a)[COLUMNS]=malloc(ROWS*sizeof*a);
int(*x)[列]=malloc(行*sizeof*x);
int(*y)[列]=malloc(行*sizeof*y);
a[100][20]='X';
x[4][999]=666;
y[500][0]=42;
扫描频率(“%d”和测试);
printf(“%d”,测试);
免费(a);
免费(x);
免费(y);
返回0;
}

我在main之外声明了数组,现在它工作得很好。但是,出于了解情况的目的,你能告诉我当我们把它放在main里面时它有什么不同吗?我提供了一些示例代码来使用
malloc
进行数组定义和初始化注意:而不是
ROWS*COLUMNS*sizeof(char)<>代码> >代码>行*列*sieOf(int),考虑<代码>行*sieOS** < /COD>和<代码>行*sieOS*b<代码>。谢谢,我已经创建了相当快的答案,并没有想到在那时添加那个转换。不需要指定两次类型。
#include<stdio.h>
#include<stdlib.h>
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;
}