0: C语言的数据结构,通常都是固定大小的,例如:数组有固定的大小
数组的使用一般是静态的,但是也可以动态的修改,方法就是内存的动态的分配
1:动态内存分配,malloc
2:动态分配字符串,malloc(n+1);
3:动态分配数组,如果是int 类型的数组就是malloc(n*sizeof(int))
4:释放内存
1: 内存分配函数(allocate 分配的意思)
malloc(manual) 函数,分配内存,但是不对内存进行初始化,
calloc (clean)函数,分配内存,并且对内存进行初始化
reallco(redo)函数,调整分配过的内存。重新分配内存这些函数包含在<stdlib.h>头文件中
2: c中的字符占用一个字节大小,为n个大小的字符串(羊肉串)分配空间,可以使用malloc(n+1)来分配,多出来的一个字节保存字符串的结束符“\0”,注意这个是零
注意这里是字符串,不是int的类型的数组//c中的字符占用一个字节大小,为n个大小的字符串分配空间,可以使用malloc(n+1)来分配,多出来的一个字节保存字符串的结束符“\0”,注意这个事零 int n = 5; char *str = malloc(n+1);//最后一个+1就是'\0' //strcpy 需要导入#include <string.h> strcpy(str,"hello");//string copy 注意这里hello是5个字节 printf("%s\n",str);
//两个字符串连在一起应该分配多大的空间呢? //系统中已经定义好了叫做strcat的函数 cat catenate 的缩写 意思是连接,连续的 char str1[30] = "Hello";//注意这里一定要能够把第一个字符串和第二个字符串一起装进去,如果给它5就不行 char *str2 = " World"; char *result = strcat(str1,str2);//将第二个装到第一个里面去 printf("result=%s\n",result);
3:动态分配数组
3.1当编程时很难为数组估计大小,可以再运行程序时,动态为程序分配大小
3.2动态分配数组大小和分配字符串大小相似,可以使用sizeof 来计算数据类型占用的字节数,再来分配,例如:
int *a = malloc(n*sizeof(int));
3.3 可以使用calloc 来分配内存大小,calloc 可以对分配的内存进行初始化。calloc的函数原型为:
void * calloc(size_t nmenb,size_t size)
使用calloc 分配数组内存大小,
int *a = calloc(n,sizeof(int));
3.4 可以使用void *recalloc(void *ptr,size_t size) 来调整内存的大小,size 为新内存的大小4:释放内存
int a[5]={1,2,3,4,5}; int *ip = malloc(sizeof(int)*5);//这里是不需要+1的因为这个不是字符串,字符串才需要加1 int *cip = calloc(5,sizeof(int));// realloc(ip,100);
4.1 malloc 等内存分配函数分配的内存,会在内存堆里面,如果一直分配都会造成内存耗尽的危险
堆内存是我们自己调用自己释放,栈内存是c语言自己调用的自己释放的,
这个有点像吃饭的,有的是自己收盘子的,有的需要客户把盘子放到指定的地方的。
4.2 分配的内存不再使用需要手动释放,释放函数式void free(void *ptr);
#include <stdio.h>#include <stdlib.h>#include <string.h>//stdlib的头文件里面包含了malloc,calloc,reallocchar * concat(char *str1,char *str2){ //主要是看看使用malloc的函数 char *result = malloc(sizeof(str1)+sizeof(str2)+1); strcpy(result,str1);//先拷贝 strcat(result,str2);//然后连接 return result;}int main(int argc,const char *argv[]){ //malloc(manual) 函数,分配内存,但是不对内存进行初始化, //calloc (clean)函数,分配内存,并且对内存进行初始化 //reallco(redo)函数,调整分配过的内存。重新分配内存 //这些函数包含在<stdlib.h>头文件中 //void * 表示任意的指针类型的 void *a = malloc(1024);//就是说a 可以是float *a, int *a //动态分配字符串 //malloc 函数原型 void *malloc(size_t size); size_t 是一个无符号整形, //c中的字符占用一个字节大小,为n个大小的字符串分配空间,可以使用malloc(n+1)来分配,多出来的一个字节保存字符串的结束符“\0”,注意这个事零 int n = 5; char *str = malloc(n+1);//最后一个+1就是'\0' //strcpy 需要导入#include <string.h> strcpy(str,"hello");//string copy 注意这里hello是5个字节 printf("%s\n",str); //两个字符串连在一起应该分配多大的空间呢? //系统中已经定义好了叫做strcat的函数 cat catenate 的缩写 意思是连接,连续的 char str1[30] = "Hello";//注意这里一定要能够把第一个字符串和第二个字符串一起装进去,如果给它5就不行 char *str2 = " World"; char *result = strcat(str1,str2);//将第二个装到第一个里面去 printf("result=%s\n",result); //测试自己写的函数 char *myresult = concat(str1,str2); printf("myresult=%s\n",myresult); /* 3:动态分配数组 3.1当编程时很难为数组估计大小,可以再运行程序时,动态为程序分配大小 3.2动态分配数组大小和分配字符串大小相似,可以使用sizeof 来计算数据类型占用的字节数,再来分配,例如: int *a = malloc(n*sizeof(int)); 3.3 可以使用calloc 来分配内存大小,calloc 可以对分配的内存进行初始化。calloc的函数原型为: void * calloc(size_t nmenb,size_t size) 使用calloc 分配数组内存大小, int *a = calloc(n,sizeof(int)); 3.4 可以使用void *recalloc(void *ptr,size_t size) 来调整内存的大小,size 为新内存的大小 */ //动态分配数组内存 int aa[5]={1,2,3,4,5}; int *ipp = malloc(sizeof(int)*5);//这里是不需要+1的因为这个不是字符串,字符串才需要加1 int *cip = calloc(5,sizeof(int));// realloc(ipp,100); //内存使用完了一定要free,上完茅厕赶快走,别站着茅坑不拉屎 //free(str); //内存的释放: int *aaa,*bbb; aaa = malloc(100); bbb = malloc(200); free(aaa); //要在赋值之前,先free(aaa),不然aaa不好释放 aaa=bbb; free(bbb); return 0;}
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow