c - 在主函数启动之前出现段错误 11(可能在结构中)

标签 c struct segmentation-fault

我想知道我的代码哪里出了问题。我刚开始学习C,刚接触指针和数组,所以我不知道错误在哪里。问题似乎出在我使用 struct 创建自己的数据类型的部分,因为当我运行程序时,我放入的调试文本都没有在控制台中显示出来。我在互联网上寻找答案但没有找到任何东西。任何帮助将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#define MAX_size 2000
typedef struct TMatrix{
    int grid[MAX_size][MAX_size];
    int sizex;
    int sizey;
} TMATRIX;
int readSize(TMATRIX *matrix);

int main(void){
    TMATRIX matrix;
    printf("DEBUG\n");
    if (readSize(&matrix)==1){
        printf ("Invalid input.\n");
        return 1;
    }

    printf("%d %d\n", matrix.sizex,matrix.sizey);

    return 0;
}

int readSize(TMATRIX *matrix){
    printf("DEBUG\n");
    if (scanf("%d %d", &matrix->sizex, &matrix->sizey)!=2) return 1;
    if (matrix->sizex<1 || matrix->sizey<1) return 1;

    return 0;
}

最佳答案

在您的 TMATRIX 结构中,您声明一个 2000x2000 整数数组。

2000*2000*4 是 16 兆字节。您正在使用大约自动变量。该大小(如果 sizeof(int)==4 但如果 sizeof(int)==8 则可能是 double )。

因此,在到达第一条指令之前,您可能会遇到堆栈溢出,当编译器生成的代码尝试为变量分配足够的堆栈空间时,典型的堆栈大小会小于该值。

修复:

  • 增加堆栈(链接器选项)
  • 使用全局变量(将matrix移到main过程之外)
  • 使用malloc分配表,而不是静态分配(为了保持多维方面,定义int (*grid)[MAX_size];并在上创建一个malloc MAX_size * sizeof *grid)

关于c - 在主函数启动之前出现段错误 11(可能在结构中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40834180/

相关文章:

c - C语言中函数名前面的*是什么意思?

c - 如何在 C 结构中默认设置变量

我可以以头文件实现中不存在的方式使用结构吗?

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c - 数组和指针 : segmentation fault

c++ - 用于集成测试的模拟库

c - 为什么条件语句中负数被视为真?

c++ - 如何选择二维数组中的另一列?

ios - swift 。无法更改结构的属性,收到表单数组

Python & clang : try. .. except 语句不适用于段错误(核心转储)