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