C语言动态分配

本文详细介绍了C语言中的内存分配方式(静态和动态),重点讲解了malloc、free、calloc、realloc等动态内存分配函数,以及如何避免内存泄漏。同时涵盖了字符串处理函数,如strlen、strcpy、strcat和字符串查找、比较等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、内存分配方式:

(1)、静态分配:

(2)、动态分配:

2、动态分配内存的API:

(1)、malloc函数

 (2)、malloc函数分配一个数组(法1)

 (3)malloc函数分配一个数组(法2)

(4)、free释放空间函数

 (5)、calloc函数

 (6)、realloc函数

 3、内存泄漏:

(1)、第一种泄露方式

 (2)、第二种泄露方式

 4、字符串处理函数:

(1)、获取字符串长度函数

(3)、字符串追加函数

 (4)、字符串比较函数

(5)、字符串查找函数

 (6)、字符串匹配函数

 (7)、字符串转换数值

 (8)、字符串切割函数

(9)、格式化字符串操作函数 

 5、练习题目


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);
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值