可能我只是缺乏对malloc如何工作的理解,但我没有看到我的代码出错:
int amount_integers = 2;
int *pointer_to_allocated_memory = (int*)malloc(amount_integers * sizeof(int));
for (int i = 0; i < amount_integers; i++)
{
int *address = &(pointer_to_allocated_memory)[i * sizeof(int)];
*(address) = 0;
}
我想为任意数量的整数初始化内存(amount_integers
可能不是2)。然而,第2行中的malloc似乎是错误的。 MSVC的调试器将在此时断开(没有定义断点)。继续时,如果*(address) = 0;
为1,则会在第6行(i
)遇到访问写入违规。
我认为我正在访问:
v pointer_to_allocated_memory[0 * sizeof(int)]
... | sizeof(int) | sizeof(int) |
^ pointer_to_allocated_memory[1 * sizeof(int)]
应该分配这些。为什么应用程序崩溃?
答案 0 :(得分:3)
数组索引不是索引字节而是数组元素,在你的情况下是ints:
int *address = &(pointer_to_allocated_memory)[i];
i
的有效值为0和1
答案 1 :(得分:1)
因为你误解了指针算术的工作原理。它不适用于字节,它适用于sizeof(T)
字节的内存块,T是指针的指向类型。所以
int *address = &(pointer_to_allocated_memory)[i * sizeof(int)];
应该是
int *address = &ptr[i];
代替。 (另请注意,缺少多余的括号和更简单的名称......)
顺便说一句,casting malloc is harmful。