0

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

1 回答 1

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?

另外,你了解过指针吗?

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

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

于 2012-05-26T22:09:37.493 回答