关于malloc和sizeof的用法

问题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);
  }
问题3
L=(LinkList)malloc(sizeof(LNode))中()malloc和sizeof()括号里分别是什么含义,
malloc是动态开辟内存,函数返回为void型指针(指向开辟的内存空间)
前面那个括号是开辟内存的类型,如L=(LinkList)malloc(sizeof(LNode)),就是将原来malloc返回的void型指针强制定义为LinkList型(也就是你一开始定义的指针L的类型),这样才可以赋值给L.
sizeof(LNode)是指malloc开辟的内存空间的大小,这里就是指,这个大小为LNode型所占的容量.(例如sizeof(int),就是开辟一个整形的空间(4字节).分配两个int的空间就是2*sizeof(int))
posted @ 2017-05-12 23:00  狼太白  阅读(21932)  评论(0编辑  收藏  举报