为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
Why my c++ code runs on Linux but not on Windows, is there a problema with RAM memory?
我是新的编程,我发现了一个问题我正在定义这样的C 数组
double name[512][512]
但是,当我在Windows上运行它(无错误的错误编译(时,它会崩溃。当我在Linux(Ubuntu(上运行时,它会在没有问题的情况下运行它应该如何做。我认为Windows限制了我的程序可以使用的内存,对吗?我该如何解决?感谢所有能给我一只手的人。
我猜测(因为您没有提供MCVE(您的name
数组是一个自动变量,因此将其分配在呼叫堆栈上。<<<<<<<<<<<<<<<<<<
顺便说一句,该问题不是RAM中的不是(由操作系统管理;用户空间程序不直接使用 ram,而是虚拟内存(,而是在您过程的虚拟地址空间(其堆栈段(。在Linux上,您可以使用/proc/
(请参阅Proc(5(和PMAP(1((查询您的过程"虚拟地址空间"。并读取操作系统:三个简单的作品以了解OS的作用。
请注意,X86-64 sizeof(name)
可能是2097152字节。
呼叫堆栈的大小受到限制。在Linux上,通常的限制为4或8兆字节(但有一种更改的方法(,在Windows上,有传言称为1兆字节。您已经有堆栈溢出。
您可能会超过该限制。考虑使用一些动态内存分配(例如使用new
;但是,通过使用更高级别的C 构造(例如容器和智能指针(,通常应该避免明确使用它(。大多数C 标准容器,尤其是std::vector
(而不是std::array
(使用它(堆(用于内部数据。
作为经验法则,每个呼叫框架都应很小(例如千数(。
,如果您在Linux上使用g++ -Wall -Wextra -Wstack-usage=1500 -g
编译,则可以警告您。还学习使用gdb
调试器。害怕不确定的行为。
您还可以使用一些额外的库,例如提供矩阵的Boost(或其他(,或者拥有您自己的Matrix
抽象数据类型(该类型会堆积数据(。请注意5
花几周时间阅读一些好的C 编程书,但请注意,C 是非常困难且复杂的编程语言(因此,还请阅读SICP了解更多一般的编程概念并使用某些方案实施,例如球拍(。后来,您可以阅读一些有关垃圾收集的书(其中的概念与内存管理有关(。
您正在击中堆栈溢出。
sizeof(double)
在Windows上是8。
因此,8*512*512
是2MB
。如果我没记错的话,Visual Studio编译器的默认堆栈大小为1MB。链接器上的/堆栈编译器开关可用于增加此尺寸。
正如其他人可能指出的那样,对于大型数组,请使用堆(malloc/new,free/delete(,而不是用数组变量拿起大量堆栈。
您可能正在尝试分配堆栈上的数组,并且Windows系统上的堆栈大小较小。如果是这样,请将数组全局或static
进行,问题将消失。
另一个选项是动态分配数组。例如:
struct Array {
double vals[512][512];
};
// in a function:
auto name_guard = std::make_unique<Array>();
auto &name = name_guard->vals;
在这里name_guard
确保在不再需要时(由name_guard
的寿命确定(时将删除存储空间,并且name
在问题中的含义与name
相同。请注意,name
不得超过后卫对象。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 不同/较旧的处理器运行c++代码的方式是否不同
- 在运行时检查继承是否只有一种类型和 void*
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 是否可以编译 Gtk+ 应用程序以同时在 Gtk 2 和 3 上运行
- 在 c++ 中是否允许创建具有运行时边界的数组?
- 是否可以在运行时强制转换模板参数?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- MinGW是否需要在Visual Studio上运行C++
- 使用 int32_t 而不是双精度运行矢量点积是否更快?
- 如何检测窗口当前是否正在运行模式对话框?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- C++如何检查程序是否首次运行?
- 确定C++应用程序是否作为具有旧版支持的 UWP 应用运行
- 如何检查 ntpd 是否仍在运行和同步
- 如果事件在仍在执行时再次设置,RegisterWaitForSingleObject 是否会并行运行回调?
- 是否可以在运行时调用用于选择要调用的用户定义文本的逻辑?
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?