王剑编程网

分享专业编程知识与实战技巧

C语言编程第十三课 动态内存 讲解和演示动态内存分配

C语言编程第十三课:动态内存。

这节课我们来学习动态内存,主要内容包括动态内存分配以及void指针类型。使用数组需要预先确定长度,但很多时候要到运行时才能确定所需的内存大小,这时候就需要用到动态内存分配。

c语言标准库中提供了不少动态内存分配的函数,比如下面这几个,待会我们来演示一下。

·要调用动态内存分配函数,我们先要把标准库头文件包含进来,等下还会要用到字符串拷贝,所以要把string.h也包含进来。

·定义一个字符指针指向hello这个字符串常量,定义一个字符指针p,然后动态分配一块内存空间,长度为str的长度,并且强制转换为字符指针类型,让p指向它。

·多分配一个字节的空间是给字符串结束符预留的,这里是强制类型转换,malloc函数返回的是void*类型,而我们的p是字符指针,所以需要强转。

·然后就可以调用字符串拷贝函数,将str的内容拷贝到p所指向的内存空间。

·最后打印拷贝结果,编译运行,拷贝成功。

注意这里缺少了非常重要的一步,释放动态分配的内存,只要是动态分配的内存空间,用完后一定要释放,否则就会导致内存资源泄露。

再来看下一个例子,我们分配动态内存空间来拷贝一个整型数组。

·先定义一个整型数组a,里面包含5个元素。

·然后定义一个整型指针p,分配一块动态内存空间,长度为数组a的长度,强转成整型指针,然后让p指向它。

·可以调用内存拷贝函数,将数组a的内容拷贝到这个内存区域内。

内存拷贝函数跟字符串拷贝函数类似,只需要将字符串的内容拷贝到这个内存区域内,就可以调用内存拷贝函数。是它多了一个参数,就是要指定拷贝多少个字节。因为是内存拷贝,所以不像字符串那样知道在哪里结束,于是必须指定要拷贝的字节数。最后循环打印出拷贝结果,编译运行,拷贝成功。

再来演示一下,使用calloc函数分配动态内存,调用方式跟malloc函数是类似的,只是参数上有所不同。它也是分配连续的内存空间,只是按块为单位来分配,需要传入块的数量以及块的大小,任意运行结果是一样的。

最后演示一下,重新分配动态内存大小。还是回到第一个例子,假如拷贝了一个hello字符串之后,还要在后面拼接一个world,这个时候内存空间的大小已经不够了,所以要重新给它扩容。

用realloc函数来将p所指向的动态内存空间大小重新调整为str和str2这两个字母串的长度之和,别忘了最后还要加上1,然后把str2拼接到后面,打印拼接的结果,编译运行,拼接成功了。

回过头来看看void指针类型,它不指向任何类型的数据,它只是一个纯粹的内存地址,不要将其理解为指向任何类型,而是指向空类型或者不指向确定的类型。动态内存就讲完了。

关注我学习更多编程知识,下课。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言