void heaptest(){
int *a;
a=(int*)malloc(1024*4);
int i=1024;
while(i--){
*a=i;
//printf("%d",*a);
a++;
}
free(a);
}
当“一个”被用作指针,假设它指向地址“地址0x20000”。这个堆区的范围是从0x20000到0x21000。总共4096字节。
while循环后,'a'被指向0x21004,这实际上超出了定义堆的范围。如果我们释放堆使用
free(a)
这个堆将被成功释放?
对于我的观察,当我在Visual Studio中使用此func 。它将显示
Invalid address specified to RtlValidateHeap
和a的值是0x21004每当是否存在在while循环一个printf()函数的游离()操作之前。
当我在上使用这个函数STM32F7(Cortex M7)的Keil-MDK时,它只显示自由操作之前的任何内容。 'a'的值将变为0x00000;
但是当我添加代码中显示的printf()函数。 'a'的值将回到初始值0x20000。
那么,最后一个问题是,是否可以改变堆指针的值?或在free()操作之前每次将它分配回初始值?
改为'a = malloc(1024 * sizeof(int));' – yano
这是我见过的最糟糕的长问题之一。它只显示缺乏基本的OP知识。如果我是他,我会立即删除它。 –
并购买初学C书。 –