我收到了argc参数的分段错误错误。我是C语言的新手。请帮我解决这个问题。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int row1, row2, col1, col2, i, j, cnt=0;
int mat1[2000][2000], mat2[2000][2000];
printf("argc=%d", argc);
if (argc<5)
{
printf("\nPlease enter correct arguments <row_no_matrix1> <col_no_matrix1> <row_no_matrix2> <col_no_matrix2>\n");
exit(0);
}
row1 = atoi(argv[1]);
col1 = atoi(argv[2]);
row2 = atoi(argv[3]);
col2 = atoi(argv[4]);
printf("%d %d %d %d\n", row1, row2, col1, col2);
return 0;
}
答案 0 :(得分:5)
您的矩阵对于您机器上的堆栈来说太大了。每个阵列有400万个整数,或大约16 MiB的存储空间;这是一个非常大的堆栈要求。
减小尺寸或动态分配。
或(如评论中所述),将它们变为“静态持续时间”的变量,位于main
内,前面带有关键字static
:
int main(int argc, char *argv[])
{
int row1, row2, col1, col2, i, j, cnt=0;
static int mat1[2000][2000], mat2[2000][2000];
或作为main()
之外定义的文件范围变量,前面还有关键字static
:
static int mat1[2000][2000], mat2[2000][2000];
int main(int argc, char *argv[])
{
int row1, row2, col1, col2, i, j, cnt=0;
或在没有关键字main()
的情况下在static
之外定义的全局变量(但只有当您有多个需要按名称访问它们的源文件时才执行此操作):
int mat1[2000][2000], mat2[2000][2000];
int main(int argc, char *argv[])
{
int row1, row2, col1, col2, i, j, cnt=0;
您也可以(再次,如评论中所述)增加堆栈大小。但是,我恭敬地建议这可能是最不令人满意的解决方案。
如何动态分配数组的大小?
公平的问题。您认为自己真的需要一对400万个单元阵列的频率与您在100x100阵列下处理的频率相比有多少?您是在Windows(使用MSVC和C89)还是非Windows(使用C99或更高版本),还是在使用GCC的Windows上?
另外,你有没有学过指针?
总的来说,我认为你应该选择更小尺寸的阵列。这是迄今为止最简单的解决方案。如果你必须有大数组,请使用静态分配的数组。
如果这不起作用,我们将不得不通过指针,但它并不漂亮。