C strcpy & memcpy & malloc & free

来源:互联网 发布:linux下编写python 编辑:程序博客网 时间:2024/06/16 18:07

strcpy

#include <stdio.h>#include <assert.h>#include <string.h>/*C语言标准库函数strcpy,把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间。1 保护源字符串 用const2 空指针的检查3 返回 char * , 返回dst的原始值,实现链式表达式*/char *mystrcpy(char *dst , const char *src){    assert(dst != NULL && src != NULL);    char *r = dst;    while( (*dst ++ = *src ++) != '\0');    return r;}int main(){    char a[] = "12345";    char b[] = "aac";    //strcpy(b,a); // 错误,目标串长度小于源字符串长度    int len = strlen(mystrcpy(a, b));    printf("%d\n", len);    printf("%s\n", a);    printf("%s\n", b);    return 0;}

C/C++——strcpy函数的 几种 实现 和 详细 解析

strcpy & memecpy

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){    int i;    char *ptr = malloc(10*sizeof(char));    ptr[0] = '1';    ptr[1] = '2';    ptr[2] = '\0';    char tmp[] = {'a', '\0', 'b'};    printf("%s %d\n",tmp, (int)strlen(tmp));    strcpy(ptr+2, tmp);    //memcpy(ptr+2, tmp , 3);    printf("%s\n",ptr);    for(i = 0; i < 5 ; i++)    {        printf("%c\n", ptr[i]);    }    return 0;}

编译运行
这里写图片描述

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){    int i;    char *ptr = malloc(10*sizeof(char));    ptr[0] = '1';    ptr[1] = '2';    ptr[2] = '\0';    char tmp[] = {'a', '\0', 'b'};    printf("%s %d\n",tmp, (int)strlen(tmp));    //strcpy(ptr+2, tmp);    memcpy(ptr+2, tmp , 3);    printf("%s\n",ptr);    for(i = 0; i < 5 ; i++)    {        printf("%c\n", ptr[i]);    }    return 0;}

再次编译运行
这里写图片描述

  • strcpy 遇到’\0’ 就结束
  • strlen 计算字符串长度时 也是遇到’\0’ 就结束
  • memcpy 则不同,按照内存里面的内容复指定长度字节

malloc & free

#include <stdio.h>#include <stdlib.h>typedef struct node{    char *name;    int sex;}student;student *stu_create(){    student *stu = (student *)malloc(sizeof(student *));    if(stu == NULL)        return NULL;    stu->name = NULL;    stu->sex = 0;    return stu;}stu_free(student *stu){    free(stu->name);    free(stu);    stu->name = NULL;    stu = NULL;}int main(){    student *stu = stu_create();    stu->name = (char*)malloc(3);    stu->name[0] = '1';    stu->name[1] = '2';    stu->name[2] = '\0';    printf("%x\n", stu);    printf("%x\n", stu->name);    printf("%s\n", stu->name);    stu_free(stu);    printf("%x\n", stu);    printf("%x\n", stu->name);    return 0;}

这里写图片描述

  • free 里面 stu = NULL;是无效的
  • 虽然stu内存空间释放了,但是stu并不指向NULL

这里写图片描述

如果free函数里面 stu->name != NULL ; 这句没有,那么stu->name内存释放了,但是stu->name不会指向NULL

这里写图片描述

这里写图片描述

这里只要没有stu = NULL;那么stu都是有地址的,但它的内存被销毁了

这里写图片描述

  • 所以在free一个结构体后,接着的一条语句,就应该让该结构体指向NULL。
0 0
原创粉丝点击