c中argc的分段错误错误

时间:2012-05-26 22:07:30

标签: c

我收到了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;
}

1 个答案:

答案 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上?

另外,你有没有学过指针?

总的来说,我认为你应该选择更小尺寸的阵列。这是迄今为止最简单的解决方案。如果你必须有大数组,请使用静态分配的数组。

如果这不起作用,我们将不得不通过指针,但它并不漂亮。