目录
1、内存分配方式:
(1)、静态分配:
(1)、在程序编译或者运行中,按照事先规定大小分配空间。int a[5]
(2)、必须知道事先所需空间的大小。
(3)、分配在栈区或者全局区的,一般用数组的形式。
(4)、按计划分配。
(2)、动态分配:
(1)、程序运行中根据大小自由分配空间。
(2)、按需分配。
(3)、分配在堆区,一般使用特定的函数分配,使用之后要释放。
2、动态分配内存的API:
(1)、malloc函数
函数原型 void *malloc(size_t size) 头文件#include<stdlib.h>
从堆区申请size个字节,通过返回值返回返回值,成功得到空间的地址,失败NULL
注意:maloc函数返回值要强制类型转换,从堆区申请空间之后要用memset对空间清0。
(2)、malloc函数分配一个数组(法1)
(3)malloc函数分配一个数组(法2)
(4)、free释放空间函数
释放空间需要的注意:释放空间防止二次释放,如若此时free(p)之后又free(q)就会导致二次泄漏。编译器会报错如下:
(5)、calloc函数
头文件:头文件#include<stdlib.h>。
函数定义:void *calloc(size_t nmemb,size_t size)。
函数功能:申请nmemb块,每块的大小为size个字节。
返回值:成功返回首地址,失败返回NULL。
(6)、realloc函数
头文件:头文件#include<stdlib.h>。
函数定义:void *realloc(void *s,unsigned int newsize)。
函数功能:首先比较原先的s内存后面空闲的空间与newsize的空间,如果s后面的内存空间大就追加,如果剩余的空间小于newsize空间就申请一个新的newsize的空间,把原先的内容拷贝过来。释放原先的内容。最后返回新内存的地址。
返回值:新申请内存的首地址。
1、追加字节:
2、减少字节:
3、内存泄漏:
(1)、第一种泄露方式
(2)、第二种泄露方式
4、字符串处理函数:
(1)、获取字符串长度函数
头文件:#include<string.h>
函数定义size_t strlen(const char *s)
函数功能:测量字符串s指向的字符串的长度
遇到换行符\0会停止。
(2)、字符串拷贝函数
1、strcpy
头文件:#include<string.h>
函数定义:char *strcpy(char *dest,const cahr *str)
函数说明:拷贝str指向的字符串到dest指向的内存中,\0也会被拷贝。
返回值:目的内存的地址。
注意:在使用此函数的时候,必须保证dest指向的内存足够大,否则会出现内存污染。
2、strncpy
头文件:#include<string.h>
函数定义:char *strncpy(char *dest,const char *str,size_t n)
函数说明:拷贝str指向的字符串前n个字节到dest指向的内存中,\0也会被拷贝。
返回值:目的内存的地址。
注意 strncpy不拷贝\0,如果n大于src指向的字符串的个数,在dest后面填充n-strlen(src)个\0。
(3)、字符串追加函数
1、strcat
头文件:#include <string.h>
函数定义:char *strcat(char *dest,const char *src)。
函数功能:把str字符串追加到dest后面,追加的时候会追加\0。
注意:保证dest空间足够大。
2、strncat
头文件:#include <string.h>
函数定义:char *strncat(char *dest,const char *src,size_t n)。
函数功能:把str前n个字符串追加到dest后面,追加的时候会追加\0。
注意:保证dest空间足够大。
(4)、字符串比较函数
1、strcmp
头文件:#include <string.h>
函数定义:int strcmp(const char *s1,const char *s2)
函数说明:比较s1和s2的字符串大小。逐个字符去比较ASCII码,一旦比较出大小就返回。
返回值:如果s1大于s2返回>0,如果s2大于s1返回<0,如果s1等于s2返回0。
2、strncmp
(5)、字符串查找函数
1、strchr
头文件:#include <string.h>
函数定义:char *strchr(const char *s,int c)
函数说明:在s字符串中寻找字符,可以是ASCII码(int类型或者char型)。如果有多个相同的字符,这只会匹配首次找到的字符。
返回值:这只会匹配首次找到的字符,返回他的地址。没找到返回NULL。
2、strrchr
头文件:#include <string.h>
函数定义:char *strrchr(const char *s,int c)
函数说明:在s字符串中寻找字符,可以是ASCII码(int类型或者char型)。如果有多个相同的字符,这只会匹配最后一次找到的字符。
返回值:这只会匹配最后一次找到的字符,返回他的地址。没找到返回NULL。
(6)、字符串匹配函数
头文件:#include <string.h>
函数定义:char *strstr(const char *s1,const char *s2)
函数说明:在s1中寻找s2的字符串,也是首次匹配。
返回值:找到了返回字符串的首地址,没找到返回NULL。
(7)、字符串转换数值
atoi/atol/atof
头文件:#include <stdlib.h>
函数定义:int atoi(const char *s1)
函数说明:将s1所表示的字符出串转换为数值型。
返回值:返回数值型。
(8)、字符串切割函数
头文件:#include <string.h>
函数定义:char *strtok(char *s1,const char *s2)
函数说明:字符串切割,按照s2中的字符去切割s1中的字符,一旦遇到就变成\0,调用一次只能切割一次,切割一次之后,再去切割时候strtok的第一个参数传NULL,意思接着上次位置切割。
注意:也是遇到第一个就停止切割。
(9)、格式化字符串操作函数
1、sprintf
格式:int sprintf(char *buf,const char *format,.....)
将format中的内容输出到buf的内存中去
2、sscanf
格式:int sscanf(const char *buf,const char *format,.....)
从buf中读取内存写入到format中去。
3、sscanf高级用法
5、练习题目
现程序,将一个字符串插入到另一个字符串的指定位置。并将插入的结果显示在屏幕上。
比如:将字符串”abc”插入到字符串”123456”的第三个位置,插入后的结果为:”12abc3456”
插入成功返回0 失败返回 -1
函数声明及调用参考如下,请实现fun函数
#include <stdio.h>
#include <string.h>
void test01(char str1[20], char str2[10], int n)
{
char str[100] = {0};
strncpy(str, str1, 3);
printf("%s\n", str); // 赋值前三个到新的str中。
strcat(str, str2);
printf("%s\n", str); // 追加str2中的内容。
strcat(str, (str1 + 3));
printf("%s\n", str);//继续追加从str1的第四个元素开始。
}
int main()
{
char str1[] = "123456";
char str2[] = "abc";
int n = 3;
test01(str1, str2, n);
}