| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 813 人关注过本帖
标题:关于函数返回指针的问题
只看楼主 加入收藏
findugs
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2009-9-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
关于函数返回指针的问题
小弟初学c,想写个函数用来字符数组的累加

代码如下:


程序代码:
#include <stdio.h>
#include <wTypes.h>

typedef struct _MyRecvStr {
  PVOID  Point;
  int  Size;
} MyRecvStr, *PMyRecvStr;

/* str1+str2的返回 */
MyRecvStr *ReturnStr (PVOID str1,int str1len, PVOID str2,int str2len)
{ 
    PVOID str3,ptemp;
    int dizhi,alllen;
    char temp2[10];
    MyRecvStr *fanhui;
    
    alllen=str1len+str2len;
    
    char temp[alllen];
    
    printf("第一个字符: %s.\n",str1);
    printf("第二个字符: %s.\n",str2);
    
    memset(&temp,0,alllen);
    
    ptemp=&temp;    /*获取要存放两个字符数组的起始地址*/
        
    memcpy(&temp,str1,str1len); /*把第一个字符数组保存到temp*/ 
    printf("temp1字符: %s.\n",ptemp);
    dizhi=(int)(ptemp);    /*把temp的地址转换成int型*/ 
     
    dizhi=dizhi+str1len;  /*获取被第一个字符数组占用后,第二个字符数组的起始地址*/
    memcpy((PVOID)dizhi,str2,str2len); /*把第二个字符数组放到temp里*/
   
    printf("temp2字符: %s.\n",&temp);
    printf("字符Size: %d.\n",alllen);
    printf("准备返回temp的指针地址: %d.\n",&temp);
    fanhui->Point=(PVOID)temp;
    fanhui->Size=16;
    
 
    
    return fanhui;
}

int main (int argc, char *argv[])
{ 
    char s1[10];
    char s2[5];
    
    memcpy(s1,"a2s2s2a3s2",10);
    memcpy(s2,"z5x5a",5);

    MyRecvStr Myrecv2;
    
    Myrecv2=*(ReturnStr(&s1,10,s2,5));
    printf("返回指针地址: %d.\n",Myrecv2.Point);
    printf("返回数据大小: %d.\n",Myrecv2.Size);
    
    char wawa[Myrecv2.Size];
    
    memcpy(&wawa,Myrecv2.Point,Myrecv2.Size);
    
    printf("返回数据内容: %s.\n",wawa); 
    
    return 0;
}


返回信息如下:

程序代码:
第一个字符: a2s2s2a3s2箇.
第二个字符: z5x5a胃wK晒wP$=.
temp1字符: a2s2s2a3s2.
temp2字符: a2s2s2a3s2z5x5a.
字符Size: 15.
准备返回temp的指针地址: 2293516.
返回指针地址: 2293516.
返回数据大小: 16.
返回数据内容: ?@.

遇到的问题是:

返回的数据不对?

请各位帮帮忙,谢谢了
搜索更多相关主题的帖子: 函数 指针 
2009-09-24 05:39
atom_09
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:92
专家分:141
注 册:2009-8-24
收藏
得分:0 
你这样 是没人帮你看的
2009-09-24 15:09
findugs
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2009-9-24
收藏
得分:0 
为什么呢,楼上的朋友,能说清楚点吗
2009-09-24 18:19
findugs
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2009-9-24
收藏
得分:0 
论坛无人?
2009-09-24 22:01
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
回复 4楼 findugs
至少有一很明显的错误:fanhui这个指针没分配内存!!!

而且str1和str2时这两个变量没有以0结尾,不是字符串,不能当字符串处理(在printf输出的时候).

身体是玩命的本钱
2009-09-24 22:57
findugs
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2009-9-24
收藏
得分:0 
谢谢楼上的朋友,我已经用解决了,下面是我解决的代码,希望给和我遇到一样问题的朋友一个提示

程序代码:
#include <stdio.h> 
#include <wTypes.h> 
 
 
/*copystr1和str2到str3这个地址去*/ 
int addtwostr(char *str1 ,int str1len ,char *str2, int str2len, char *str3) 
{ 
    int dizhi; 
             
    memcpy(str3,str1,str1len); 
    dizhi=0; 
    dizhi=(int)str3+str1len; 
    memcpy((PVOID)dizhi,str2,str2len); 
     
    return 0;    
} 
 
int main (int argc, char *argv[]) 
{ 
 
    int alllen; 
    alllen=100;  
    char *str1=(char *)malloc(alllen); 
    memset(str1,0,alllen); 
    char *str2=(char *)malloc(alllen);  
    memset(str2,0,alllen); 
    char *str3=(char *)malloc(alllen*2);     
    memset(str3,0,alllen); 
         
     
    char *str4=(char *)malloc(alllen);/*分配alllen个char类型的内存空间*/ 
    char *str5=(char *)malloc(alllen);/*分配alllen个char类型的内存空间*/ 
        
    str4="zxzxzxzxz|"; 
    str5="tytytytyt|"; 
     
    memcpy(str1,str4,10); 
    memcpy(str2,str5,10); 
     
    addtwostr(str1,10,str2,10,str3); 
    printf("str3:=%s.\n",str3); 
     
    return 0; 
} 


下面是返回结果:

F:\c>a 
str3:=zxzxzxzxz|tytytytyt|.

2009-09-24 23:14
jig
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:0 
LZ 对指针的理解还不够透彻才会如此。你原有代码中

MyRecvStr *ReturnStr (PVOID str1,int str1len, PVOID str2,int str2len)
{  
    PVOID str3,ptemp;
    int dizhi,alllen;
    char temp2[10];
    MyRecvStr *fanhui;


改为  MyRecvStr *fanhui = (MyRecvStr *)malloc(sizeof(MyRecvStr));  

当然在main的最后要记得释放,养好习惯。

就应该可以了。虽然你换了种做法达到了目的,但其实你本质上是遇到个指针的使用问题,是对指针的理解问题。LZ可以多多做做实验来验证把玩指针,毕竟这是C的灵魂。

[ 本帖最后由 jig 于 2009-9-25 00:49 编辑 ]

个人网站 -  http://.h001.
2009-09-25 00:47
findugs
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2009-9-24
收藏
得分:0 
感谢jig版主的回复

小弟对指针真的是有点摸不到头,呵呵

第一帖的代码,实际上返回的指针地址和函数里需要返回的字符数组的地址是一个地址,为什么会在main里读返回的地址就没有数据呢?我觉得可能是

在函数里定义的MyRecvStr *fanhui;是私有变量,在return的时候会被消除,所以导致在main里读同样的地址一个有数据一个没有数据

以上仅为个人猜想而已哈,有什么不对,请版主和各位朋友指正哈,学习嘛,呵呵



第二种方法达到目的,用的也是指针,进入函数处理的参数是 在main函数里申请的内存的地址,所以没有问题哈,当然后面处理完,没有free,刚写c几天,还没习惯,感谢版主jig指正。

[ 本帖最后由 findugs 于 2009-9-25 01:38 编辑 ]
2009-09-25 01:31
jig
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:20 
你理解的很到位。在一个局部函数,开辟的一个指针变量只是一个4字节指向你要给出的地址的一个指向。当函数结束的时候,这个函数里的所有局部变量都将被释放,然后也许会被写入其他的数据。

而这个时候你将此地址返回后,再显示,那其实就是读到了已经不被站用的内存了(即被其他部分可能使用了)所以有可能出现乱码或每次显示都有不同,而有时又是正确的。

有此深入一点:其实我们使用的程序段内存是有一个"使用表"来记录每个内存位置当前是否被使用的,这也是malloc等函数能正确分配到空闲内存的原因。

如果要进一步探究,那只能是研究一下C语言编译器在将C语法转化为汇编的过程,就可本质理解内存,指针,malloc,字长等一系列问题。

[ 本帖最后由 jig 于 2009-9-25 02:27 编辑 ]

个人网站 -  http://.h001.
2009-09-25 02:26
快速回复:关于函数返回指针的问题
数据加载中...
 
   



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

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