malloc(0)的返回值

不少嵌入式c面試,會問到這個問題,我也就百度了下,集合幾位網友的分析,記錄下來,便於我本身隨時查看面試

當malloc分配內存時它除了分配咱們指定SIZE的內存塊,還會分配額外的內存來存儲咱們的內存塊信息,用於維護該內存塊。所以,malloc(0)返回一個合法的指針並指向存儲內存塊信息的額外內存,咱們固然能夠在該內存上進行讀寫操做,可是這樣作了會破壞該內存塊的維護信息,所以當咱們調用free(ptr)時就會出現錯誤spa

ptr = malloc(0*sizeof(char)) ;
ptr是局部指針變量,存儲在棧中,它的值是動態分配的一塊堆中的空間的首地址
因此說這個地址是合法的,可是因爲malloc的大小是0,故這個這個地址指向的堆中的存儲空間的大小是0,
這個指針相似於一個野指針,可使用的,可是是有風險的,由於不知道這個指針後面的內存空間被誰使用着,要是被核心進程使用,哪確定會形成相應程序的崩潰
關於加上free後,程序會崩潰,我理解是因爲在堆中並無對應的空間分配到致使的~
指針

#include <stdio.h>
#include <stdlib.h>
#include <string.h>進程

int main()
{
 char *ptr ;
 ptr = malloc(0*sizeof(char)) ;
 
 if (NULL == ptr)
  printf("got a NULL pointer/n");
 else 
 {
  printf("got a Valid pointer/n");
  
  strcpy(ptr,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); 
 
  printf("the string at %p is :%s/n",ptr, ptr);
 // free(ptr);
 }
 return 0 ;
}內存

相關文章
相關標籤/搜索