gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:02:14 25 4
gpt4 key购买 nike

我是一个真正的 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

最佳答案

首先:

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)。

关于c++ - 使用 make test 运行程序并直接调用它时的奇怪行为 ./prog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com