1

私は本物のC++初心者なので、我慢してください。

簡単なプログラムがあります。でコンパイルしてg++ -Wall prog.cpp -o progから実行すると、./progsegfaultsだけになります。

いじくり回した後、makefileを作成しました(以下を参照)。を実行するmake testと、プログラムがコンパイルされて正常に実行されます。で実行すると./prog、segfaultsになります。(正確なエラーメッセージは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;
}

これがmakefileです:

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];

スタックオーバーフローがあります。

doubleプラットフォームでがバイトであると仮定すると8、3 つのアレイのサイズは 20 MB ( ) を超えます3 * 8 * 1000 * 1000。たとえば、私の Linux マシンでは、すべてのプロセスに割り当てられるスタック サイズは 8192 kB です。

2番:

シェルでは機能しないのに Makefile コンテキストでは機能する理由については、次を試してみてください。

(segfault が発生しないように) に変更し、プログラムの先頭にこの関数呼び出しを追加しますN10

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

Makefile コンテキスト (たとえば is の出力値)とシェル (たとえばsystemisの出力値) では、スタック サイズが異なることがわかります。8192systemunlimited

于 2012-11-20T21:58:25.437 に答える