为什么用同一个方法为两个字符串赋值,第二次会出现问题


 #include<stdio.h>
#include<stdlib.h>
typedef struct {
    char *ch;
    int length;
}str;
int main()
{
    char chars[]="asdfghjkl"; 
    str T
    StrAssign(T,chars);

    char chars2[]="asdfghjkmas"; 
    str S;
    StrAssign(S,chars2);
    show(T);
}
Status StrAssign(str &T,char *chars)
{
    int i;
    char*c;
    if(T.ch) free(T.ch);
    for(i=0,c=chars;*c;i++,c++);
    for(int j=0;j<i;j++)
    if(i==0){T.ch=NULL;T.length=0;
    } 
    else{
        if(!(T.ch=(char*)malloc(i*sizeof(char))))
        exit (OVERFLOW);
        for(int j=0;j<i;j++)
        T.ch[j]=chars[j];
        T.length=i;        
    }
    printf("%d\n",T.length);
    return OK;
}
Status show(str T)
{
    for(int j=0;j<T.length;j++)
    printf("%c\t",T.ch[j]);
    return OK;
}

修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -1
typedef int Status;
typedef struct {
    char *ch;
    int length;
}str;
Status StrAssign(str &T,char *chars)
{
    int i;
    char*c;
    if(T.ch) free(T.ch);
    for(i=0,c=chars;*c;i++,c++);
                                  //for(int j=0;j<i;j++)
    if(i==0){T.ch=NULL;T.length=0;
    }
    else{
        T.ch=(char*)malloc((i+1)*sizeof(char));
        if(!T.ch)
            exit (OVERFLOW);
        for(int j=0;j<i;j++)
            T.ch[j]=chars[j];
        T.length=i;
    }
    //printf("%d\n",T.length);
    return OK;
}
Status show(str T)
{
    for(int j=0;j<T.length;j++)
        printf("%c\t",T.ch[j]);
    printf("\n");
    return OK;
}
int main()
{
    char chars[]="asdfghjkl";
    str T;
    T.ch = NULL;
    StrAssign(T,chars);

    char chars2[]="asdfghjkmas";
    str S;
    S.ch = NULL;
    StrAssign(S,chars2);

    show(T);
    show(S);

    return 0;
}