为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题

Why my c++ code runs on Linux but not on Windows, is there a problema with RAM memory?

本文关键字:运行 是否 RAM 内存 问题 Windows Linux 我的 而在 为什么 代码      更新时间:2023-10-16

我是新的编程,我发现了一个问题我正在定义这样的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*5122MB。如果我没记错的话,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不得超过后卫对象。