C 二维结构阵列->;无法修复分段错误:(

C 二维结构阵列->;无法修复分段错误:(,c,arrays,data-structures,segmentation-fault,dynamic-memory-allocation,C,Arrays,Data Structures,Segmentation Fault,Dynamic Memory Allocation,所以(双关语)我想从HackerEarth解决这个问题: 这是我的代码: #include <stdio.h> #define ll long long int main () { ll int N; scanf("%d", &N); ll int i, j, a, b; ll int TOTAL; typedef struct { ll int flag; ll int count;

所以(双关语)我想从HackerEarth解决这个问题:

这是我的代码:

#include <stdio.h>
#define ll long long 

int main () {
    ll int N;
    scanf("%d", &N);
    ll int i, j, a, b;
    ll int TOTAL;

    typedef struct {
        ll int flag;
        ll int count;
        // int fc[N]; // farmer cost OR cost for farmer i
        ll int *fc;
    } land;

    // check whether all of them have been
    // initialised to 0
    // printf("%d ", arr[2][2].count);
    // yes

    land arr[1000][1000];
    for(i=0; i<1000; i++) {
        for(j=0; j<1000; j++) {
            arr[i][j].fc = (ll int *)calloc(N, sizeof(ll int));
        }
    }

    ll int x1, y1, x2, y2, c;
    ll int ta, tb; // temp a // temp b
    for(i=0; i<N; i++) {
        scanf("%lld %lld %lld %lld %lld", &x1, &y1, &x2, &y2, &c);
        // the array index starts from 0
        // so to match the inputs to the correct indices
        // the inputs must be reduced by one
        for(a=x1; a<=x2; a++) {
            for (b=y1; b<=y2; b++) {
                ta = a-1;
                tb = b-1;

                arr[ta][tb].count++;
                if(arr[ta][tb].count >= 2)
                    arr[ta][tb].flag = 1;

                arr[ta][tb].fc[i] = c;
            }
        }
    }

    ll int k;
    for(i=0; i<1000; i++) {
        for(j=0; j<1000; j++) {
            if (arr[i][j].flag == 1) {
                for(k=0; k<N; k++)
                    TOTAL += arr[i][j].fc[k];
            }
        }
    }

    printf("%lld", TOTAL);
    return 0;
}
#包括
#定义ll long long
int main(){
ll int N;
scanf(“%d”和“&N”);
ll int i,j,a,b;
ll int TOTAL;
类型定义结构{
ll int标志;
ll整数计数;
//int fc[N];//农民成本或农民i的成本
ll int*fc;
}土地;
//检查它们是否都已被删除
//初始化为0
//printf(“%d”,arr[2][2]。计数);
//对
土地面积[1000][1000];

对于(i=0;i您的行:
land arr[1000][1000];
arr
声明为一个自动变量,这意味着空间是从堆栈分配给它的。简言之,当调用函数时,此堆栈是分配给本地使用的内存(而
main
实际上只是运行程序时操作系统调用的一个函数)

通常,堆栈上的可用空间是有限的,通常为16-64 KB。但是,您的
arr
变量(假设长整型
为8字节,指针为8字节)将需要超过24 MB的。这几乎肯定是导致“堆栈溢出”的原因

这个问题的“快速解决方案”是声明变量
static
。这意味着在编译时(或者更可能在链接时)分配空间,并在程序运行时“锁定”到内存中。(您可能会注意到,执行此操作后,可执行文件的大小会增加24 MB,具体取决于您的平台!)

下面是您的代码的一个稍加修改的版本,包括此更正,以及一些其他建议的改进(都用“//”注释分隔符标记:

#包括
#包括
#定义ll long long
int main(){
ll int N;
scanf(“%lld”,&N);///普通“%d”格式需要一个“int”参数-使用“%lld”表示“long-long-int”
ll int i,j,a,b;
ll int TOTAL=0;///如果不初始化“TOTAL”,它可以从任何值开始!
类型定义结构{
ll int标志;
ll整数计数;
//int fc[N];//农民成本或农民i的成本
ll int*fc;
}土地;
//检查它们是否都已被删除
//初始化为0
//printf(“%d”,arr[2][2]。计数);
//对
static land arr[1000][1000];///如果没有“static”,此数组(~24兆字节)将溢出堆栈!
对于(i=0;i<1000;i++){
对于(j=0;j<1000;j++){
arr[i][j].fc=(ll int*)calloc(N,sizeof(ll int));
}
}
ll int x1、y1、x2、y2、c;
ll int ta,tb;//温度a//温度b
对于(i=0;i对于(a=x1;a哪一行代码导致segfault?在我看来,
land arr[1000][1000];
这一行看起来有点可疑。你要求在堆栈上创建一个大小>=2400万字节的自动变量!!如果这不会导致堆栈溢出,我不确定会发生什么。(您可以尝试移出
main
并使其成为
static
——我同意这不是最好的代码,但它可能有助于诊断。)使用MSVC(VS2019)编译时,我收到了这个警告(以及其他一些警告)警告C6262:函数使用“24000112”字节的堆栈:超过/分析:STACKSIZE“16384”。考虑将一些数据移到堆。@ AdRiangMoor非常感谢您的反馈!至少现在我知道哪几行引起了问题。在大学里,我们几乎没有启动数据结构(只完成数组)。。这意味着我对堆栈和堆一无所知。呵呵,我可能应该尝试一种更简单的方法来解决这个问题。不过,出于好奇,我很想看看更正后这段代码会是什么样子。