1. 程式人生 > >關於malloc和sizeof的用法

關於malloc和sizeof的用法

bsp 強制轉換 alt class 強制 int 解釋 void nbsp

問題1:

1.
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

2.
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

其中L是已經定義的線性表,LIST_INIT_SIZE是線性表存儲空間的初始分配量,listsize是當前分配的存儲容量(以sizeof(ElemType)為單位)

解釋:

第一個句子:
用malloc分配一段這麽LIST_INIT_SIZE*sizeof(ElemType)多個字節的內存段,它返回一個指向該內存段首字節的指針變量,然後把這個指針變量強制轉換為ElemType*類型,再把這個經轉換的指針變量賦給L的elem成員
第二個句子:
先看一段話:
realloc語法:指針名=(數據類型*)realloc(要改變內存大小的指針名,新的大小)。//新的大小一定要大於原來的大小,不然的話會導致數據丟失!
所以你這個句子的意思是:把L的elem指向的那段內存擴大LISTINCREMENT*sizeof(ElemType)個字節。
sizeof的用法:這是一個運算符(而不是一個函數,這點認識很重要)
sizeof(類型說明符,數組名或表達式)

sizeof 變量名
得到一個對象或者類型所占的內存字節數。
例如,如果你的機器上int占4字節,那麽sizeof(int)就是4
malloc用法:
它是一個函數,原型是void *malloc(size_t size);
前面提過了,就是分配size個字節的內存,然後返回指向這段內存首字節的指針,void* 表示未確定類型的指針,void *可以指向任何類型的數據,更明確的說是指申請內存空間時還不知道用戶是用這段空間來存儲什麽類型的數據(比如是char還是int或者...),所以你要用它指向什麽數據,一般就要在malloc前加一個強制轉換,把這個指針轉為適合你使用的類型。

問題2:

L.elem =(int*)malloc(LIST_INIT_SIZE * size(int)); 後面加這句話if(!L.elem) exit(OVERFLOW);

貌似是不對的? 這個是個指針,那你去非也不一定為0
if(L.elem == NULL)
  {
  printf( "不能成功分配存儲空間。");
  exit(1);
  }

關於malloc和sizeof的用法