strcpy实现

在GitHub上看见一个学习C的笔记,于是就看了他的代码,发现有编译未成功的,于是自己也想试一试。
第一个是实现C 的strcpy函数,代码如下:

/****************************************
技巧07:使用指针实现字符串复制(复制函数没有写成功)
****************************************/
/*
#include <stdio.h>
copy(char *s,char *q)
{
  int i=0;
  for (;*s!='\0';)
    {
      *q=*s;
      s++;
      q++;
    }
  *q='\0';
}
main()
{
  char *str,*p;
  str="hello world!";
  copy(str,p);
  printf ("%s",p);
  return 0;
}

在经过各种努力情况下找出原因:p未分配内存,于是自己用了realloc 来分配内存,一直调试通不过,结果发现是realloc是对已经分配过的变量进行重新分配,如果 p为 NULL,它的效果和 malloc() 相同,即分配 size 字节的内存空间。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
mycopy(const char *s,char *q)
{

  if(s==NULL || q== NULL){
    printf ("null");
  }else{
    int i=0;
  for (;*s!='\0';)
    {
      *q=*s;
      s++;
      q++;
    }
  *q='\0';
  }
}
int main()
{
  char *str="hello   copy";
  char *p;
    p=(char *)malloc(strlen(str)+1);
  mycopy(str,p);
  printf ("%s",p);
  return 0;
}

需要注意几点:

  1. 分配内存
    malloc(int num)
    在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。分配成功返回首地址,否则返回null。
    calloc(int num, int size)
    在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
    realloc(void *address, int newsize);
    该函数重新分配内存,把内存扩展到 newsize。如果 ptr 为 NULL,它的效果和 malloc() 相同,即分配 size 字节的内存空间。

如果 size 的值为 0,那么 ptr 指向的内存空间就会被释放,但是由于没有开辟新的内存空间,所以会返回空指针;类似于调用 free()。

几点注意:
指针 ptr 必须是在动态内存空间分配成功的指针,形如如下的指针是不可以的:int *i; int a[2];会导致运行时错误,可以简单的这样记忆:用 malloc()、calloc()、realloc() 分配成功的指针才能被 realloc() 函数接受。
成功分配内存后 ptr 将被系统回收,一定不可再对 ptr 指针做任何操作,包括 free();相反的,可以对 realloc() 函数的返回值进行正常操作。
如果是扩大内存操作会把 ptr 指向的内存中的数据复制到新地址(新地址也可能会和原地址相同,但依旧不能对原指针进行任何操作);如果是缩小内存操作,原始据会被复制并截取新长度。
【返回值】分配成功返回新的内存地址,可能与 ptr 相同,也可能不同;失败则返回 NULL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值