首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 在C函数中,怎么样将一个数组返回?
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LoveLiuLi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-02-28 11:50:59 楼主
    我写了一个函数,下面是代码
    /*截取字符串*/
    char *x_Substr(char *s,int offset,int len)
    {
      char p[6];
      int i,k,j;
      k = offset + len;
      j = 0;
      for (i=offset;i <k;i++)
      {
    p[j] = s[i];
    printf(",,%c,,",p[j]);
    j++;
      }
      p[j] = '\0';
    }
    请问怎么将P返回啦?请助
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dizuo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-02-28 11:59:121楼 得分:0
    C/C++ code
    不要用数组,用new // char p
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 11:59:272楼 得分:0
    只能返回受地址指针,应该用动态分配内存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • icemine
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 12:05:383楼 得分:0
    char *p;
    p = (char *)malloc(sizeof(char)*6);
    ...
    return p;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • okifyou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 12:12:044楼 得分:0
    返回指向数组的指针就行啦,通过指针访问数据的内容
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Acyk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 12:29:155楼 得分:0
    一楼的,人家说的是C语言里,你new都跑C++了,3楼的正解,楼主派分吧
    不过我有个问题,如果malloc在函数内部,这个p所指的空间在外部能不能访问呢?最近看c++看多了,呵呵,总在想这类问题,不好意思
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyjsjcom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 12:35:516楼 得分:0
    1.用malloc动态分配的方法, 但稍不谨慎就可能  内存泄露
    2. 把数组 封装到一个结构体中,  但函数的 返回值要改变一下

                  ----------参考  c专家编程
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • VxD1
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

    发表于:2008-02-28 12:47:597楼 得分:0
    返回指针,用动态分配内存或者用静态数组
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LoveLiuLi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 12:50:518楼 得分:0
    char  *p;
    p  =  (char  *)malloc(sizeof(char)*6);
    ...
    return  p;

    这个是返回的是指针吧,不是内容吧,那P释放了呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shaoze5
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 13:14:599楼 得分:0
    p的释放:你调用完后不在使用p的这个地址的时候再释放
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hustwf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 14:05:2410楼 得分:0
    一般的做法是把这个substr作为传入传出参数,就不需要在函数内分配内存了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • djf715
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 14:31:0711楼 得分:0
    p[j]  =  '\0';
    后直接加上:
    return p;
    就可以啦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • IlikeEnglish
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 14:36:4312楼 得分:0
    把数组定义为外部链接性质,然后直接return p
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BMCRNET
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 16:09:1613楼 得分:0
    何必那么麻烦

    char p[6];  //搞成全局的不得了!

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • huaideyiban
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 17:47:3614楼 得分:0
    p[j]      =      '\0'; 
    后直接加上:
    return  p;
    就可以啦
    #####
    这样不行,因为p是局部变量

    3楼正解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zenny_chen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 19:13:0715楼 得分:0
    比较好的方法是将要返回的数组作为行参,让调用者提供。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chlaws
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 20:41:1416楼 得分:0
    (1) return 语句不能返回指向"栈内存"的"指针" 或者"引用",因为该内存在函数体结束时被自动销毁.
    楼主你只要明白这句话就知道怎么做了.
    根据你的要求都有很多处理方法.
    定义个全局变量或者是在函数内部申请一个指向堆的指针就OK了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangb_soso
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 21:57:0317楼 得分:0
    返回指针,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • songsong33
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 22:07:1818楼 得分:0
    可以用malloc,也可以直接调用strdup函数,最后加上 return _strdup(p);
    道理楼上已提到,malloc生成的"堆内存"不会因为函数结束释放,局部变量("栈内存")才会在函数结束时释放;
    所以在使用完该变量是,需要调用free函数来释放内存
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kings_zqz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 22:39:5219楼 得分:0
    我也觉得是3喽
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 22:42:4820楼 得分:0
    楼主:确实是返回指针,内容是无法“返回”的,但是你有了指针,通过指针访问内容不是C的基本操作么?

    上面那位教人家用全局变量的,难得不知道这是现代软件工程最反对的么?假如一个函数不同次调用返回不同值,你咋办?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • brookmill
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-28 23:56:0021楼 得分:0
    个人觉得1楼3楼的方法有点危险,如果是小程序还好,程序大了很容易内存泄漏。
    我投10楼一票。
    顺便提醒LZ,使用数组的时候尽量检查越界,除非做不到。比如这个函数的len如果大于6就越界了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • netxuning
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 08:57:4622楼 得分:0
    /*截取字符串*/
    char  *x_Substr(char  *s,int  offset,int  len)
    {
        static char  p[6];
        int  i,k,j;
        k  =  offset  +  len;
        j  =  0;
        for  (i=offset;i <k;i++)
        {
      p[j]  =  s[i];
      printf(",,%c,,",p[j]);
      j++;
        }
        p[j]  =  '\0';
      return p;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lokibalder
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 09:22:0423楼 得分:0
    在函数内malloc,就可以了

    char p【6】;
    这样返回p,会因为使用了栈空间,p的内容会在函数结束后释放,以后p的内容就不是现在的内容了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • int2e
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 09:31:1824楼 得分:0
    把返回用的临时变量放在全局数据区或堆区
    1.放在全局数据区的可用static静态局部变量
    static char  p[6];
    会在程序结束时自行释放
    2.放在堆区的要自己在使用完后释放
    char*  p=(char*)malloc(len-offset+1);
    char*  q= x_Substr();
    使用后
    free(q);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • changke18
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 09:43:3925楼 得分:0
    C# code
    char p[6]; 在栈中分配空间,函数退出后就被回收 所以p虽然是个地址,但不可以返回,因为空间被回收了 不可以return p; char *p=(char*)malloc(6*sizeof(int)); 在堆中分配空间,函数返回时,空间不被回收,可以return p;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • makewater
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 09:46:5026楼 得分:0
    c语言不能返回数组,只能通过返回数组指针的方式,来达到返回数据的效果
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iami007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:04:0527楼 得分:0
    直接返回局部变量的地址好像也是可以的阿。。。。
    我用的是DEV-C++5.0,在编译的时候有警告:
    C:\160572\C\pp.c [Warning] function returns address of local variable
    试验的代码如下:

    C/C++ code
    #include <stdio.h> char *x_Substr() { char p[6]={'a','b'}; printf("%x %c %c\n",p,p[0],p[1]); return p; } int main(){ char* x=x_Substr(); printf("%x %c %c\n",x,x[0],x[1]); system("pause"); return 0; } 运行结果如下: 22ff30 a b 22ff30 a b Press any key to continue . . .
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xxmv99
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:06:0128楼 得分:0
    看大伙支持3楼多一些,但是如何释放P呢?函数体内没有free啊?,如25楼
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iami007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:08:1629楼 得分:0
    有人能不能讲一下为什么“不能直接返回局部变量的地址呢”?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iami007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:09:5130楼 得分:0
    25楼说的蛮有道理的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhouweiz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:12:1031楼 得分:0
    最好在主调用函数中分配和释放内存,否则代码不容易维护!
    被调用函数中返回指针的方法很多。
    27楼的:你只用了个简单的代码测试,之所以成功是因为那段内存没有被重新使用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iami007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:14:5732楼 得分:0
    31楼,那么该怎样才能让程序出错呢?
    怎么样才能改成复杂的代码让程序出错呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ni_in
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 10:31:0533楼 得分:0
    同意10楼的,又不用分配内存,调完函数直接用,多好。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzyjsjcom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 12:18:4634楼 得分:0
    typedef struct str_tag
    {
        char a[6];
    }str_type;

    str_type str;
    /* 对数组操作  */
    return str;

    看来大家还是对  代码敏感一点  ............
    哈哈 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xadream
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 12:29:3935楼 得分:0
    栈里面的无法返回 你用堆吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • niepan228
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 12:53:4736楼 得分:0
      再在形参列表里加个字符指针,它的实参应该是一个字符数组的首地址,然后把你那个s变成这个形参数组就好了。但是最后是再为这个形参数组在函数开始的时候动态分配一个与原数组等长的空间,这样不容易引起错误。C语言动态分配是用malloc()包含在malloc.h头文件里.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jbnbear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 13:29:5537楼 得分:0
    函数里定义的变量作用域出了这个函数就消失了,所以只能返回值类型的
    要返回引用类型的,建议 用 ref
    例如

    void  fun(ref char [] aa,int i)
    {
    ……
    }

    用的时候
    char aa[6];

    fun(ref aa,5);

    这样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CUG87525842
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 13:46:3238楼 得分:0
    楼主别忘了free申请的内存
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fannytong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 23:30:2439楼 得分:0
    局部变量数组在函数结束后不存在,导致返回的指针内容未知。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Michael_555
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-29 23:58:2940楼 得分:0
    这么多人,难道就24楼的知道static……

    char  *x_Substr(char  *s,int  offset,int  len)
    {
        static char  p[6];
        …………
        return p;
    }

    或者malloc()
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hustwf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-01 13:36:4941楼 得分:0
    回LS,

    如果我多次调用这个函数,会覆盖的,static不是好方法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hjxaut
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-02 09:11:5042楼 得分:0
    3楼说的是正解,返回局部变量时,该局部变量早已经销毁了,应该该地址在栈内,而在堆内分配的地址不会被回收;
    最后需要在调用处将该值free;

    char* p=x_Substr(...);
    p[0],p[1]//操作;
    free(p);
    p=null;
    修改 删除 举报 引用 回复