可能我只是不了解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的调试器将在此时中断(没有定义断点)。当继续时,当i
为1时,它将在第6行(*(address) = 0;
)遇到访问写入冲突。
我认为我正在访问的内容:
v pointer_to_allocated_memory[0 * sizeof(int)]
... | sizeof(int) | sizeof(int) |
^ pointer_to_allocated_memory[1 * sizeof(int)]
这些应该分配。为什么应用程序会崩溃?
数组索引不是索引字节,而是索引数组元素,在您的情况下是int:
int *address = &(pointer_to_allocated_memory)[i];
i
的有效值为0和1
因为您误解了指针算术的工作原理。它不处理字节,而是处理sizeof(T)
字节的内存块,t是指针的指针类型。所以
int *address = &(pointer_to_allocated_memory)[i * sizeof(int)];
应该是
int *address = &ptr[i];
相反。(还要注意没有多余的括号和更简单的名称…)
顺便说一句,铸造malloc是有害的。