注册 登录
编程论坛 数据结构与算法

字符串赋值问题?

genzbw 发布于 2013-03-11 19:38, 1467 次点击
求教:
   我定义了一个结构
    typedef struct{
        char * ch;//用来保存字符串
        int length;//字符串的长度
    }S;

    然后定义了一个方法用来给结构赋值
    Status strAssign(S t,char* chars){
        if (t.ch!=NULL) {
            free(t.ch);
            t.ch=NULL;
        }
        int i;
        char *c=chars;
        for (i=0;*c!='\0';++c) {
            ++i;
        }
        if (!i) {
            t.ch=NULL;
            t.length=0;
        }else{
            t.ch=(char*)malloc(i*sizeof(char));
            if (!t.ch) {
                exit(SOVERFLOW);
            }
            for (int j=0; j<i; j++) {
               t.ch[j]=chars[j];
            }

            t.length=i;
        }
        return OK;//ok表示成功
    }

    然后我写了一个测试
    char *a="hello world";
    S str;
    strAssign(str, a);
    这时我发现执行完strAssign后当前的str值仍然为未赋值状态。

    请教高人:
    1.为什么str的值没有被赋值成功?
    2.另外我看到书中对代码中标红的地方 可以写成 t.ch[0..i-1],为什么我这样写编译器会报错,能告知这是什么意思吗?

    谢谢回复!
5 回复
#2
genzbw2013-03-12 11:14
昨天晚上看了一下c语言的书,原来对结构体变量赋值的方法是值传递,所以当该变量进入strAssign方法时,我认为它这个变量会被拷贝一份,然后对该变量赋值,当函数结束时变量被释放了,所以在函数外面的变量没有被赋值,那么如果我在函数中返回函数中操作的变量就会有值。 那么结构体变量在什么时候分配的空间,在函数中是怎么被拷贝的呢?
#3
ithaibo2013-03-12 16:43
楼主你好,
    首先,给字符串赋值的操作,不需要写函数。你可以去参考C语言的字符串操作的库函数。   
    再则,你写的赋值函数Status strAssign(S t,char* chars),在这个函数中,你的形参S t是有问题的,因为你需要传递的是t的地址,因此应该用的是指针。我建议你改为S *t。然后再试试吧
#4
yuccn2013-03-12 16:49
因为你的Status strAssign(S t,char* chars)  t是传值的,不是传地址。。
改成这样行了

void strAssign(S &t,char* chars){
    if (t.ch!=NULL) {
        free(t.ch);
        t.ch=NULL;
    }
………………
}
void main()
{
    char *a="hello world";
    S str = { 0 };// 注意这个地方最好初始化一下。不然你的程序还是会崩溃的。自己想下为什么
    strAssign(str, a);

}

#5
genzbw2013-03-15 11:30
我的程序确实如楼上所说,会在执行的时候抛出异常,pointer being freed was not allocated,然后给str初始化之后就没有这个问题了。所以我认为是free(t.ch)这个方法导致的。如果变量没有初始化,那么它会导致在申请的空间中有一些地址中的值被使用,那我的方法free(t.ch)就会出问题。

另外: t.ch[0..i-1],在C语言版本的数据结构中出现,请问它是什么意思,网上也没有搜索到?
#6
不玩虚的2013-03-16 22:11
要用c语言的话我也学习下,c++会了,它坑爹的我连基本的c语言的输入都不会
1