| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1467 人关注过本帖
标题:字符串赋值问题?
只看楼主 加入收藏
genzbw
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2013-3-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
字符串赋值问题?
求教:
   我定义了一个结构
    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],为什么我这样写编译器会报错,能告知这是什么意思吗?

    谢谢回复!
搜索更多相关主题的帖子: 结构 字符串 
2013-03-11 19:38
genzbw
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2013-3-10
收藏
得分:0 
昨天晚上看了一下c语言的书,原来对结构体变量赋值的方法是值传递,所以当该变量进入strAssign方法时,我认为它这个变量会被拷贝一份,然后对该变量赋值,当函数结束时变量被释放了,所以在函数外面的变量没有被赋值,那么如果我在函数中返回函数中操作的变量就会有值。 那么结构体变量在什么时候分配的空间,在函数中是怎么被拷贝的呢?
2013-03-12 11:14
ithaibo
Rank: 2
等 级:论坛游民
帖 子:52
专家分:50
注 册:2012-3-30
收藏
得分:10 
楼主你好,
    首先,给字符串赋值的操作,不需要写函数。你可以去参考C语言的字符串操作的库函数。   
    再则,你写的赋值函数Status strAssign(S t,char* chars),在这个函数中,你的形参S t是有问题的,因为你需要传递的是t的地址,因此应该用的是指针。我建议你改为S *t。然后再试试吧
2013-03-12 16:43
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6814
专家分:42393
注 册:2010-12-16
收藏
得分:10 
因为你的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);

}


我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-12 16:49
genzbw
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2013-3-10
收藏
得分:0 
我的程序确实如楼上所说,会在执行的时候抛出异常,pointer being freed was not allocated,然后给str初始化之后就没有这个问题了。所以我认为是free(t.ch)这个方法导致的。如果变量没有初始化,那么它会导致在申请的空间中有一些地址中的值被使用,那我的方法free(t.ch)就会出问题。

另外: t.ch[0..i-1],在C语言版本的数据结构中出现,请问它是什么意思,网上也没有搜索到?
2013-03-15 11:30
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:0 
要用c语言的话我也学习下,c++会了,它坑爹的我连基本的c语言的输入都不会

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-03-16 22:11
快速回复:字符串赋值问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017858 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved