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書。 –