使用 make test 运行程序并直接调用它时出现奇怪的行为 ./prog
Weird behaviour when running a program with make test and calling it directly ./prog
我是一个真正的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
)。
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 控制允许动态运行c++的并发操作数
- 使用 make test 运行程序并直接调用它时出现奇怪的行为 ./prog