为什么当 malloc 大小这么大时会出现访问内存错误?

Tom*_*Tom -3 c++ windows malloc memory-leaks large-data

正如你所看到的,当我运行它时,我遇到了内存访问错误。但是如果我将 malloc_size 更改为 100,它就可以工作。如何在不更改 malloc_size 的情况下修复它。

int malloc_size = 900000;
float* ptr = (float *)malloc(malloc_size);


for (int i = 0; i< malloc_size; i ++) {

    ptr[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*tke 6

malloc接受要分配的字节数作为参数。malloc_size为了简单起见,假设您的值为 100。

for 循环迭代 whilei < malloc_size可能会超出该限制,因为在内部,您正在访问ptr[i] = 0;. ptr是一个指向 a 的指针float,它很可能有四个字节大。这意味着访问偏移量或 处的ptr[i]字节。当达到 25 时,您将访问 offset 处的字节,即超出末尾的字节。i * sizeof(float)i * 4i25 * 4 = 100

越界访问数组是未定义的行为,在您的情况下,它会导致程序崩溃。

C++ 建议

由于这个问题被标记为malloc ,我也建议根本不要使用。一个更好的选择是new

float* ptr = new float[100] {}; // array of size 100
                                // all elements are initialized to zero
// ...
delete[] ptr;
Run Code Online (Sandbox Code Playgroud)

您仍然需要使用new和手动管理内存delete,因此使用它会更容易std::vector

#include <vector>
// ...

std::vector<float> vec(100); // vector of size 100
                             // all elements are initialized to zero
// no need to free/delete
Run Code Online (Sandbox Code Playgroud)