1

我是一个真正的 C++ 菜鸟,所以请耐心等待。

我有一个简单的程序。当我编译它g++ -Wall prog.cpp -o prog然后用它运行它时,./prog它只是段错误。

经过一番修修补补,我写了一个makefile(见下文)。如果我运行make test,程序编译并运行良好。如果我用 运行它./prog,它会出现段错误。(确切的错误信息是Segmentation fault (core dumped)

谁能解释为什么?

这是程序:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>

int main() {

    srand(time(NULL));

    //int i, j, k, i2, j2, k2;
    int N = 1000;

    double mul1[N][N];
    double mul2[N][N];
    double res[N][N];

    printf("N: %d\n", N);

    for(int x=0; x<N; x++) {
        for(int y=0; y<N; y++) {
            mul1[x][y] = rand() % 100;
            mul2[x][y] = rand() % 100;
            res[x][y] = 0;
        }
    }

    return 0;
}

这是生成文件:

all: prog

prog: prog.cpp
    $(CXX) -Wall -g -o $@ prog.cpp

test: prog
    ./prog

clean: 
    rm -f prog
4

1 回答 1

4

第一的:

int N = 1000;

double mul1[N][N];
double mul2[N][N];
double res[N][N];

你有一个堆栈溢出。

假设double8您平台上的字节,您的 3 个数组的大小超过 20 MB ( 3 * 8 * 1000 * 1000)。例如,在我的 Linux 机器上,为每个进程分配的堆栈大小为 8192 kB。

第二:

关于为什么它不能在 shell 上工作,但它在 Makefile 上下文中工作,你可以试试这个:

更改N10(因此它不再出现段错误)并在程序开头添加此函数调用:

 system("ulimit -s");  // system is in stdlib.h

您会看到 shell 中的堆栈大小(例如 is 的打印值system8192与 Makefile 上下文中的堆栈大小(例如 is 的打印值system)不同unlimited

于 2012-11-20T21:58:25.437 回答