提问人:Tom 提问时间:9/8/2023 最后编辑:Tom 更新时间:9/8/2023 访问量:87
为什么当 malloc 尺寸这么大时访问内存错误?
why access memory error when malloc the size so large?
问:
正如你所看到的,当我运行它时,我遇到了内存访问错误。 我将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;
}
答:
6赞
Jan Schultke
9/8/2023
#1
malloc
接受要分配为参数的字节数。
为了简单起见,假设你是 100。malloc_size
for 循环迭代 while 可能会超过该限制,因为在内部,您正在访问 . 是指向 的指针,它很可能有 4 个字节大。这意味着访问偏移量为 或 的字节。当达到 25 时,您将访问偏移量处的字节,即超过末尾的字节。i < malloc_size
ptr[i] = 0;
ptr
float
ptr[i]
i * sizeof(float)
i * 4
i
25 * 4 = 100
越界访问数组是未定义的行为,在您的情况下,它会导致程序崩溃。
C++ 建议
由于这个问题被标记为 c++,我也建议不要使用。
一个更好的选择是:malloc
new
float* ptr = new float[100] {}; // array of size 100
// all elements are initialized to zero
// ...
delete[] ptr;
您仍然必须使用 和 手动管理内存,因此改用 std
::vector 会容易得多:new
delete
#include <vector>
// ...
std::vector<float> vec(100); // vector of size 100
// all elements are initialized to zero
// no need to free/delete
评论
(float *)malloc(malloc_size);
-- 这里创造了多少个?如果你说“有malloc_size的浮标正在创建”,那你就错了。float
float* ptr = (float*)calloc(malloc_size, sizeof(float));
float *ptr = new float[malloc_size];
malloc_size
for