当为int分配空间时,Malloc表现得很奇怪

时间:2014-04-12 12:40:41

标签: c visual-studio malloc access-violation

可能我只是缺乏对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)]

应该分配这些。为什么应用程序崩溃?

2 个答案:

答案 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