【问题标题】:segmentation fault before execution of main执行 main 之前的分段错误
【发布时间】:2016-09-06 09:01:30
【问题描述】:

我正在练习 c 并且在主函数执行之前面临分段错误(“hi”没有打印,甚至 gdb 也没有提到错误行,除了调用来自主函数)。 有人可以帮我解决错误的出处吗?我尝试在网上找出错误并在网上冲浪,但在任何地方都找不到我所拥有的代码类型。

   #include<stdio.h>

    int main(){
        printf("hi");
        double L,dx,dy,dt;

    scanf("%lf %lf %lf %lf",&L,&dx,&dy,&dt);

        int i,j;
        int x=L/dx;
        int y=L/dy;
        double ar[1000][1000];
        double o1=x/2;
        double o2=y/2;
        int D=2;
        double den[1000][1000];
        double den1[1000][1000];
        //printf("hi");

        for(i=0;i<x;i++)
        {
            for(j=0;j<y;j++)
            {
                if(i==o1 && j==o2)
                {
                ar[i][j]=1;
                den[i][j]=1;
                }
                else
                {
                    ar[i][j]=0;
                    den[i][j]=0;
                }
            }
        }
        //printf("hi");
        for(i=1;i<x-2;i++)
        {
            for(j=1;j<y-2;j++)
            {
                den1[i][j]=den[i][j]+((den[i+1][j]-den[i][j]+den[i-1][j]-den[i][j])/dx*dx+(den[i][j+1]-den[i][j]+den[i][j-1]-den[i][j])/dy*dy
                    )*dt+((den[i+1][j]-den[i][j]+den[i-1][j]-den[i][j])/dx*dx+(den[i][j+1]-den[i][j]+den[i][j-1]-den[i][j])/dy*dy)*dt;
            }
        }
        for(i=0;i<x;i++)
        {
            for(j=0;j<y;j++)
            {
                printf("%lf",ar[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        for(i=0;i<x;i++)
        {
            for(j=0;j<y;j++)
            {
                printf("%lf",den1[i][j]);
            }
            printf("\n");
        }
        printf("\n");

        return 0;
    }

【问题讨论】:

  • ""hi" is not printing " 试试printf("hi\n");
  • 移除c++标签 - 你使用的是C而不是C++

标签: c segmentation-fault


【解决方案1】:

包括数组在内的局部变量存储在堆栈中。 Linux 上的默认堆栈大小为 8MB。只有一个数组是 800 万字节,1000 * 1000 * 8(sizeof(double) 是 8)。你有三个这些数组。

要么使这些数组全局化,要么动态分配。

【讨论】:

  • 嗨,我知道这是一个非常古老的线程。你会建议什么来抓住他的想法? GDB 对此当然只字未提。谢谢!
  • @HCSF 这样的堆栈溢出几乎是不可能捕获的。良好的编码实践、静态分析工具和代码审查在很大程度上有助于从一开始就防止它发生。使用Valgrind 或类似工具可能是可能的。
【解决方案2】:

您的函数可能使用了过多的堆栈内存,由以下几行引起:

double ar[1000][1000];
double den[1000][1000];
double den1[1000][1000];

解决方案:从堆中分配内存:

double* den = malloc( 1000 * 1000 * sizeof( double ));
etc.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 2021-06-30
    • 2020-02-24
    • 2012-01-29
    • 1970-01-01
    • 2015-10-13
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多