2012-11-20 60 views
1

我是一個真正的C++ noob,請耐心等待。使用make test直接調用它時出現奇怪的行爲./prog

我有一個簡單的程序。當我編譯它與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 [email protected] prog.cpp 

test: prog 
    ./prog 

clean: 
    rm -f prog 

回答

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。

二:

至於爲什麼它不會對殼工作,但它在Makefile背景下運作的,你可以試試這個:

變化N10(所以它不再段錯誤),並添加此在你的程序的開頭函數調用:

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

你會看到,堆棧大小的外殼是不同的(例如system打印的值是8192 )比在Makefile上下文中(例如,system的打印值是unlimited)。

+0

請耐心等待:我的機器有2GB內存,這是怎麼回事?爲什麼它會與'make test'一起工作?謝謝! – Wukerplank

+0

您有2GB *物理*內存。堆棧溢出問題與虛擬內存和地址空間有關。它與使用物理內存沒有任何關係。 –

+0

@Wukerplank這不是你有RAM的問題,而是操作系統爲每個進程分配多少的問題。在Linux中使用'ulimit -s'知道多少。 – ouah

相關問題