wsx666946 发表于 2022-7-6 21:40:41

有关字符串赋值问题

int strassign(Str &str, char *ch) //将ch字符串的值赋给str.ch
{
    //初始化str
    if(str.ch)
    {
      free(str.ch);
    }
    int len=0;
    char *c=ch;
    while(*c)//计算ch字符串的长度
    {
      ++len;
      ++c;
    }
    if(len==0)
    {
      str.ch=NULL;
      str.length=0;
      return 1; //赋值成功返回1
    }
    else
    {
      str.ch=(char*)malloc(sizeof(char)*(len+1));
      //取len+1是为了多分配一个空间存放“\0”字符
      if(str.ch==NULL)
            return 0;//空间分配失败。
      else
      {
            c=ch;
            for(int i=0;i<=len;++i,++c)//<=是为了把“\0”赋值上
            {
                str.ch=*c;
            }
            str.len=len;
            return 1;
      }
    }
}
因为不知道怎么发代码所以就直接敲出来了请见谅
以上的代码我有两个地方没理解,第一个是在一开始为什么要释放原串的空间,虽然我知道释放以后指针的值还在,但是没明白有什么用,以及后面的重新申请内存空间的地方,不是很理解
第二个是在while循环中c应该已经指向串的尾部了,为什么在后面直接用c=ch 把ch指向的地址直接给了c?

ba21 发表于 2022-7-6 21:40:42

问题一,释放str.ch内存空间,避免内存泄漏,不能体现吧代码严谨
问题二, 此处c作为临时变量使用,不破坏原来的指针,c = ch(ch是参数传进来的),c指向ch的头,移动c,str.ch=*c;实现复制

临时号 发表于 2022-7-6 21:55:30

1.因为要给str.ch赋值,待会会将str.ch指向另一个地址,所以要先释放原来的地址空间
2.这只是让c这个指针指向另一个地址而已,为什么不可以呢

wsx666946 发表于 2022-7-7 16:12:55

临时号 发表于 2022-7-6 21:55
1.因为要给str.ch赋值,待会会将str.ch指向另一个地址,所以要先释放原来的地址空间
2.这只是让c这个指针指 ...

明白了谢谢

wsx666946 发表于 2022-7-7 16:13:26

ba21 发表于 2022-7-6 22:08
问题一,释放str.ch内存空间,避免内存泄漏,不能体现吧代码严谨
问题二, 此处c作为临时变量使用,不破坏 ...

懂啦懂啦 感谢
页: [1]
查看完整版本: 有关字符串赋值问题