扫描整数值时出现分段错误

时间:2015-10-22 14:33:18

标签: c segmentation-fault

虽然这很奇怪,但我在扫描整数值时遇到分段错误。

这是我的计划:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int t,n,i,j;
    char c;
    int grid[1000][1000],right[1000][1000],down[1000][1000];
    scanf("%d",&t);
    printf("hello\n");
    while(t--)
    {
        scanf("%d",&n);

        memset(right, 0, sizeof(int) * 1000 *1000);
        memset(down, 0, sizeof(int) * 1000 *1000);

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%c",&c);
                printf("CHAR = %c\n", c);
                if(c == '.')
                    grid[i][j] = 1;
                else
                    grid[i][j] = 0;
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                printf("%d",grid[i][j]);
            }
        }
    }
    return 0;
}

执行gdb会在第scanf("%d",&t);行显示细分错误。我无法弄清楚这是怎么回事?

[在Linux 32位机器上使用gcc-4.8.4]

2 个答案:

答案 0 :(得分:1)

问题是您的阵列:<Goods> <ItemGoods> <Item> <itemName>Item1</itemName> <price>299.00</price> </Item> </ItemGoods> <ServiceGoods> <Service> <itemName>Service1</itemName> <price>4.99</price> </Service> </ServiceGoods> </Goods> gridright太大而无法放入堆叠。

就没有编译错误的原因而言:

因为在语法或语义方面,此代码没有任何问题。链接器也没有任何问题。

当加载程序尝试加载程序并在堆栈上分配大量内存时,会出现问题。在Linux系统上堆栈通常是8 MB,你的阵列超过了它。

您可以将它们设置为静态(如注释中所示),因为静态成员分配在bss或数据段上。但实际上,如果你需要这么大的阵列,你需要重新思考。

答案 1 :(得分:0)

设置链接器以指示加载器分配一个足够大的最大堆栈段限制以适合您的大型本地阵列。