今天写线性表的实现,又遇到了很多的难题,C语言的指针真的没学扎实。很多基础都忘了。

一是 :malloc 函数的使用。

二是:C语言逻辑运算符。

一、原型:extern void *malloc(unsigned int num_bytes);

头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。
二、函数声明(函数原型):

void *malloc(int size);

说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。这个在MSDN上可以找到相关的解释,具体内容如下:

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.
翻译:malloc返回指向已分配空间的void指针,如果没有足够的可用内存,则返回NULL。要返回指向void之外的类型的指针,请在返回值上使用类型转换。返回值指向的存储空间保证适当地对齐以存储任何类型的对象。如果size为0,则malloc在堆中分配零长度项并返回指向该项的有效指针。始终检查malloc的返回,即使请求的内存量很小。

三、malloc与new的不同点

  从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:

int *p;

  p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

  或:

  int* parr;

  parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;

 

    而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。

 int* p;

  p = (int *) malloc (sizeof(int));

  第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

  第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:

  int* p = (int *) malloc (1);

  代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。

  malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。

  比如想分配100个int类型的空间:

  int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。

  另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

  除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

总结:

malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。

C语言中提供了三种逻辑运算符:
&&(与运算)
||(或运算)
!(非运算)

这里主要讲 !非运算(!)
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
    !(5>0)
的结果为假。

虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。

     (*L).elem = (LElemType_Sq*)malloc(LIST_INIT_SIZE*sizeof(LElemType_Sq));
if(!(*L).elem)
exit(OVERFLOW); //分配内存失败

因为如果分配失败 malloc函数返回的是NULL指针 说有上面的代码逻辑是对的。

最新文章

  1. NOIP模拟赛 最大匹配
  2. applicationContext.xml和web.xml的一些配置
  3. 【Java】Lucene检索引擎详解
  4. easyUI之layout
  5. hibernate常见错误
  6. char和vchar
  7. oc-15-枚举结构体
  8. Android(java)学习笔记151: SurfaceView使用
  9. Tomcat中server.xml配置及Context的配置说明
  10. 利用GPS获取行车速度和距离
  11. MP3文件结构及解码概述
  12. Linux下利用nc命令来监控检测服务器的端口使用情况(转载)
  13. jdbc连接字符串
  14. AS3.0 给addEventListener里的方法加上参数传递
  15. 辅助测试工具xip.io
  16. nodes 验证码
  17. Redux入门学习
  18. OpenGL学习--08--基本渲染(灯光)
  19. python 报错 SyntaxError: Non-ASCII character
  20. 在xshell中使用sftp上传文件

热门文章

  1. 在lnmp环境下,将原来的PHP7.0升级到PHP7.2
  2. Docker 快速删除所有容器
  3. 数组练习题A财务管理
  4. Nancy 寄宿IIS
  5. 解决Python安装模块出错 ImportError: No module named setuptools
  6. [转] mongoDB与mongoose
  7. BFC的形成和排版规则
  8. Bootstraptable源码
  9. H5利用pattern属性和oninvalid属性验证表单
  10. word图片自动编号,前面加章节号