QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 794|回复: 4

两个让我郁闷的函数!!!请帮我!!!

[复制链接]
发表于 2005-5-29 13:14:26 | 显示全部楼层 |阅读模式
[code:1]
#include "t.h"
int StrAssing(HString *T,char *chars){ //由字符常量chars生成串T
        int i,j;
//        if(T->ch)
//                free(T->ch);
        i=strlen(chars);
        if(!i){
                T->ch=NULL;
                T->length=0;
        }
        else{
                T->ch=(char *)malloc(i*sizeof(char));
                if(!T->ch)
                        exit(1);
                T->length=i;
                for(j=0;j<i;j++)
                        T->ch[j]=chars[j];
                }
                return 1;
}


int StrCopy(HString *T,HString S){ //由S复制生成串T
        int i;
//        if(T->ch)
//                free(T->ch);
        if(S.length=0){
                T->ch=NULL;
                T->length=0;
        }
        else{
                T->ch=(char *)malloc(S.length*sizeof(char));
                if(!T->ch)
                        exit(1);
                for(i=0;i<S.length;i++)
                        T->ch[i]=S.ch[i];
                T->length=S.length;
        }
        return 1;
}[/code:1]
1.为什么这两个函数把注释了的行添上去就出现段错误?
2.第二个函数不能达到copy的目的,主要原因在哪儿?[/code]
发表于 2005-5-29 13:36:41 | 显示全部楼层
//   if(T->ch)
//      free(T->ch);
1.
T->ch应该是指针吧,开始时T->ch可能是一个随机值,指向内存中所有可能的位置,如果这个地址是其它程序的内存段,你就没有权限,保护错,所以你不可以用他是否是0来判断他是否是有数据,其实你两行代码是完全没有必要的,因为只要你给它赋值,那么那个内存块(就算真的有数据)就会被丢弃,你又何必多此一举去释放它呢

2.
T->ch=(char *)malloc(S.length*sizeof(char));
主要在这里,因为
T->ch它有向系统申请了S.length个字符长度
然后再通过
      for(i=0;i<S.length;i++)
         T->ch=S.ch;
复制
然后把长度值也复制过来
T->length=S.length
回复

使用道具 举报

 楼主| 发表于 2005-5-29 15:39:57 | 显示全部楼层
但如果我还想再调用这个函数对同一个串赋第二次值怎么办呢?这个指针不要释放吗?
回复

使用道具 举报

发表于 2005-5-29 23:59:57 | 显示全部楼层
的二次赋值前当你然要有义务要释放内存(或者用另外一个指针接替),不然会有Memory Leak.
回复

使用道具 举报

发表于 2005-6-16 08:59:40 | 显示全部楼层
那你要在定义一个指针变量后,马上给他赋值NULL,然后在释放前判断是否为NULL,如果不是则释放,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 19:30 , Processed in 0.041886 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表