【问题标题】:Segmentation fault 11 (probably in struct) before the main function even started [duplicate]在主要功能开始之前的分段错误11(可能在结构中)[重复]
【发布时间】:2016-11-27 21:34:42
【问题描述】:

我想知道我的代码中的错误在哪里。我刚开始学习 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;
}

【问题讨论】:

标签: c struct segmentation-fault


【解决方案1】:

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

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

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

修复:

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

【讨论】:

  • 如果您在“ TMATRIX 矩阵;”之后放置返回比程序成功完成。我在任何地方都看不到任何自动变量。
  • @Tomᚊíma 您看到了优化的效果:由于变量未使用,编译器将其完全删除。
  • matrix 是一个自动(又名本地)变量。你有另一种未定义的行为,可能是因为你的编译器不检查堆栈,所以如果你不使用变量它不会崩溃,但是一旦你在最后一个索引中使用它,你就会写 where这是不允许的(是的,昆汀可能是对的:优化了!!!)
  • @Jean-FrançoisFabre 您可以很好地动态分配二维数组:int (*grid)[MAX_size]; /* ... */ grid = malloc(MAX_size * sizeof *grid);
  • @Jean-FrançoisFabre 它连续的 - 比较 int **grid 这不会。
猜你喜欢
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2020-06-18
相关资源
最近更新 更多