为什么当 malloc 尺寸这么大时访问内存错误?

why access memory error when malloc the size so large?

提问人:Tom 提问时间:9/8/2023 最后编辑:Tom 更新时间:9/8/2023 访问量:87

问:

正如你所看到的,当我运行它时,我遇到了内存访问错误。 我将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;
}
C++ Windows 内存泄漏 malloc 大数据

评论

0赞 463035818_is_not_an_ai 9/8/2023
请标记您仅使用的语言
5赞 PaulMcKenzie 9/8/2023
(float *)malloc(malloc_size);-- 这里创造了多少个?如果你说“有malloc_size的浮标正在创建”,那你就错了。float
2赞 PaulMcKenzie 9/8/2023
但是如果我将malloc_size更改为 100,它可以工作——不,它不会“工作”。您正在越界访问项目,这意味着您正在调用未定义的行为。
0赞 Aykhan Hagverdili 9/8/2023
您可以使用 calloc 分配所有清零的内存。float* ptr = (float*)calloc(malloc_size, sizeof(float));
0赞 Pete Becker 9/8/2023
更改为将消除该问题。这假定它是数组中的元素数,这是循环所暗示的,而不是字节数。float *ptr = new float[malloc_size];malloc_sizefor

答:

6赞 Jan Schultke 9/8/2023 #1

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

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

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

C++ 建议

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

float* ptr = new float[100] {}; // array of size 100
                                // all elements are initialized to zero
// ...
delete[] ptr;

您仍然必须使用 和 手动管理内存,因此改用 std::vector 会容易得多:newdelete

#include <vector>
// ...

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