使用 make test 运行程序并直接调用它时出现奇怪的行为 ./prog

Weird behaviour when running a program with make test and calling it directly ./prog

本文关键字:prog 运行 test make 程序 调用 使用      更新时间:2023-10-16

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

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

经过一番修补,我写了一个制作文件(见下文)。如果我运行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: %dn", 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

首先:

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。

第二:

关于为什么它在 shell 上不起作用,但它在 Makefile 上下文中工作,您可以尝试以下操作:

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

 system("ulimit -s");  // system is in stdlib.h
您将看到 shell 中的堆栈大小(例如,system 的打印值为

8192 )与 Makefile 上下文中的堆栈大小不同(例如,system 的打印值为 unlimited )。