C语言基础之malloc/free和string家族

一、开辟和释放堆区空间

malloc

#include <stdlib.h>
/*
功能:开辟堆区空间
参数:空间字节大小
返回值: 成功:返回堆区空间首地址,失败:返回NULL
*/
void *malloc(size_t size);



在堆区开辟空间,常用格式:

type  *a=(type *)malloc(sizeof(type)*n);

若开辟的空间过大,可能会导致开辟失败(此时会返回NULL),因此开辟空间后都要有一个是否开辟成功的判断


    int *p = (int *)malloc(sizeof(int) * 10);//没开辟成功会返回NULL

    if (p == NULL)//容错判断,判断空间是否开辟成功
    {
        printf("开辟失败");
        return -1;
    }
     // 只有当指针指向的有确切地址的时候(不是指向NULL),才能直接对其进行赋值操作
     *p=66;

    free(p);//释放开辟的空间
    p=NULL;//避免p变成野指针

 free

#include <stdlib.h>

/*
功能:回收开辟的堆区空间
参数:空间首地址
返回值:无
*/
void free(void *ptr);

在free操作以后一定要将指针赋值NULL,避免其变成野指针!!


二、string家族

strlen

求字符串中实际元素个数

#include <string.h>
/*
功能:计算字符串的实际元素个数(字符串长度)
返回值:元素个数
*/
size_t    strlen(const char *s);

注意strlen 和sizeof的区别 !!!

strcpy

错过字符串定义时的直接赋值后,想要直接赋值,就得用strcpy() 

#include <string.h>
/*
功能:字符串复制
参数:dest:目标字符串(待赋值的字符串)  ,src:原字符串(dest想要赋的“值”)
返回值:目标字符串dest首地址
*/

char *strcpy(char *dest, const char *src);

注意:

1.dest必须是可被修改的,不能是只读的,dest也必须是已经开辟好空间的!

因为dest的内容是会被修改的,所以指向在常量区中的字符串的首地址的指针不能做dest(因为p的内容是一个常量,不能改变)

char *p="hello"  <-->  char  const *p="hello" ;

2.当dest与src不等长

 dest比src长时:

'\0'也会被复制过去,所以实际dest的长度( sizeof(dest))比打印出来的要长,因为打印时遇到'\0'就认为字符串结束了。

dest比src短时:

会发生越界错误!!


strncpy

#include <string.h>

/*
功能:指定长度的字符串复制(对dest替换指定数目的字符)
参数: dest和src同strcpy()
       n:复制前n个字符
返回值:同strcpy()
*/

char *strncpy(char *dest, const char *src, size_t n);

自己实现strcpy():

对在子函数中计算形参大小的问题时,尤其是形参是数组或指针时一定要注意,主函数传入的是否是一个地址(数组名),因为对于地址,64OS中其大小统一为8B。

例:


strcat

去掉dest的'\0'然后再拼接

注意越界的问题!!

#include <string.h>

/*

功能:实现字符串拼接 
参数:dest:目标字符串首地址  src:原字符串首地址
返回值:目标字符串首地址


*/

char *strcat(char *dest, const char *src);

自己实现strcat()


 strcmp

#include <string.h>
/*
功能:字符串比较
参数:两个字符的首地址
返回值: s1-s2
*/

int strcmp(const char *s1, const char *s2);

从头到尾依次比较,一旦不同,则比较结束(即对应位置字符比较)

返回值就是不同的那一对字符的ASCII码差值(int d=*s1-*s2)

d=0  =>   s1==s2

d<0  =>  s1<s2

d>0  =>  s1>s2 

自己实现strcmp

 三、递归函数

经典名句:自己调用自己

递归:递推与回归

例:求阶乘

      

 注意:递归一定要有结束条件!!!(何时结束递推进行回归)且每次调用一定要越来越接近结束条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值