由于数组的分配是定义的时候就要分配,但是要是分配的少了就会出现程序的运行和想象的不一样或者是出现错误,要是分配的多了而用的少了又会出现资源的浪费,这个在大型的程序中是很浪费的,所以就要动态分配,动态分配在使用的时候再分配,知道要分配多少,这样会使得空间的利用率比较高,在C语言中常用的有库函数提供的malloc()函数,calloc()函数,realloc()函数,来分配,void *malloc(size_t size );参数是分配的空间的大小,为了可移植性,用sizeof()比较好,返回值是一个可以转化为任何类型指针的空指针;void *calloc(size_t num,size_t size)这个和malloc基本一样,就是把大小分成数目和每个单位的字节数,但是有一个不同就是calloc是会把分配的单位的值初始化为零的,而malloc不会;void *realloc( void* memblock, size_t size );这个函数是用来改变一块儿已经动态分配的内存的大小的,还要最后注意用void free( void* memblock );函数来释放内存哦
创新互联公司2013年至今,先为太子河等服务建站,太子河等地企业,进行企业商务咨询服务。为太子河企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
是的,c中数组定义时要指定大小。
当然,万事也不是绝对的。例如:1.作为形参的时候,可以不指定,因为在函数调用的时候,数组会转为指针的。2.当为字符串数组时,char ST[]="hello word"这儿定义了一个ST字符数值,不需要你自己去指定大小,系统会自动生成长度为11.
如果我们需要更多的内存来存储一个数组,可以通过malloc函数来动态分配内存,这块内存是 匿名的,返回动态内存段首字节的地址。可以把地址赋给一个指针变量p,指针p可以访问这块内存。p默认char类型。
malloc函数返回值一般为char类型的指针,从ASC开始返回值为void类型的指针,可以用于 返回数组 的指针和 返回结构 的指针。 所以我们用指针变量指向这块地址的时候会进行强制类型转换。
重点
数组名是该数组首元素的地址,因此让指针p指向这个块的首元素。便可以像数组名一样使用它,所以p[0]是这个块的首元素。
1.声明数组时,用常量表达式表示数组维度,用数组名访问元素。 静态数组(静态内存或自动内存中创建)
2.声明变长数组,用变量表达式表示数组维度,用数组名访问。 动态数组(这种只能在自动内存中创建)
3.声明一个 指针,调用malloc(),返回值赋给指针, 用指针访问元素 。动态数组(指针可以静态可以自动)
在应用中malloc()函数和free()函数需要配合使用
因为在大型项目中服务器不会停止,我们需要free释放内存否则内存会爆炸。
1.NULL:将指针赋予NULL,将指针悬空,不指向任何位置。NULL不是被定义为0,就是被定义为(void *)0。
2.len: 我在main()外定义一个全局变量,用来记录开内存的次数。
3.我们定义add()函数:来开辟新内存,释放原来内存,将旧内存上的指针拷贝至于新内存上。
1)新开内存pnew,并将它转换成int型。
2)判断原内存p是否存在
3)如果原内存p存在,将原有内存的内容p,用memcpy()函数拷贝至新内存pnew。
p[len]=data;
data++; //在这里我们不要疑惑 我们采用了用指针表示数组的方法。因为数组名=首地址p
4)将p指向新开内存pnew
5)关键:将输入参数数据data存放在最后 p[len]位置上
在这里内存和数据可以这样理解
在内存中我们这样理解, 手是指针,苹果是数据,袋子是内存空间。 手不能直接取得数据必须开辟相应的内存空间来取苹果。
第一个袋子装了一个苹果,我们用手指向袋子,但是呢我们想要再拿一个袋子装更多的苹果,我们用malloc开拿一个新的足够合适的袋子(内存段)来承载苹果(数据),将第一个苹果放到第二个袋子里同时将第一个袋子(指针p)销毁(free释放)。同时用memcpy函数将旧地址数据拷贝值拷贝到新地址(将旧袋子苹果取出放到新袋子里)
最后在将最后p[len]上放入新传入参数。
然后再用treavel函数将add函数处理后的p打印出来。因为p是全局变量,所以对p的一些运算作用域在全局。