【问题标题】:Segmentation Fault in a brief amount of code一小段代码中的分段错误
【发布时间】:2019-03-30 14:57:27
【问题描述】:

我正在尝试一些事情,但遇到了这个小障碍。为什么我在这个场合得到 segault ?

int main()
{
    int col_num,row_num=0;
    FILE *f = fopen("db.csv", "w+");

    int row_max = 10000;        
    int col_max = 10000;

    !!!row_num & col_num is determined due to time!!!

    int end_matrix[row_num][col_num];
    for(int row=0;row!=row_max;row++){
        for(int column=0;column!=col_max;column++){
            end_matrix[row][column] = row*column;    
        }  
        fprintf(f,"\n");
    }
    fclose(f);
}

【问题讨论】:

  • row_maxcol_max 是什么?
  • col_num 的值是不确定的(可能被视为随机或垃圾)。 row_num 的值为零。是什么让您认为这些值对于数组维度来说是很好的值?
  • 我添加了 row 和 col_max 定义。编译完美完成,但执行时出现段错误。
  • 现在你有另一个问题:算术有符号整数溢出。仍然可以找到int 是 16 位的系统,但几乎普遍 int 是 32 位,这意味着它将保持大约负 20 亿到正 20 亿之间的值。您的计算 row * column 会溢出,这会导致(甚至更多!)未定义的行为
  • 最后一个可能的问题:局部变量,包括数组(和变长数组)通常存储在栈上。堆栈是有限的资源,在 Windows 上,每个进程的默认堆栈只有一个 MiB。如果您循环 10000 * 10000 次,这意味着您的阵列的内存将接近 10 giga 字节。

标签: c


【解决方案1】:

您正在使用 C99 可变长度数组功能来定义 end_matrix 的大小。不幸的是,row_numcol_num 都为零,这意味着两个“维度”都没有分配任何存储空间。当您尝试写入数组时,由于没有为其保留存储空间,因此您正在写入超出末尾并触发表现为段错误的未定义行为。

您似乎将row_maxcol_max 定义为常量;也许您打算在定义 end_matrix 时使用它们而不是 row_numcol_num

【讨论】:

  • 我添加了必要的内容。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多