免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2860 | 回复: 15
打印 上一主题 下一主题

请教高手!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-17 21:22 |只看该作者 |倒序浏览
/******************************************************/
/*  本程序的目的是通过PutIntValue(Value)设置全局变量  */
/*  用GetIntValue()将相应的值取出                     */
/******************************************************/

#include <stdlib.h>;
#include <stdio.h>;
#include <string.h>;

#define  VARARRAYNUM 2

typedef struct {
        void *pb;
        short int cb;/*pb的长度*/
        char kind;
}VAR_POOL_INF;

VAR_POOL_INF VarPoolInf[20]={{"abcd", 5, 'C'},
                              {"123.456", 6, 'D'},
                                                          
                              {"xyzd  iad   ", 13, 'C'},
                              {"0987", 5, 'C'},
                              
                              {NULL, 2, 'I'},
                              {"123.321", 15, 'D'},
                            };
char *GetIntValue(int VarNo, int arrayno);
int   PutIntValue(int VarNo, int Value, int arrayno);


main()
{
    PutIntValue(2,2345,0);
    printf("%s\n", GetIntValue(2,0));
}

int PutIntValue(int VarNo, int Value, int arrayno)
{
    VAR_POOL_INF *tmp;
    tmp=VarPoolInf+VarNo*VARARRAYNUM+arrayno;

    tmp->;pb=&amp;Value;
    return 0;
}

char *GetIntValue(int VarNo, int arrayno)
{
    VAR_POOL_INF *tmp;
    char rt[20];
   
    tmp=VarPoolInf+VarNo*VARARRAYNUM+arrayno;

    memcpy( value, tmp->;pb, tmp->;cb );

    sprintf(rt, "%d", (int*)tmp->;pb);

    return rt;
}

运行结果是rt=0
请教程序问题所在和怎样改正
谢谢!

论坛徽章:
0
2 [报告]
发表于 2003-01-17 21:27 |只看该作者

请教高手!!!

以后写代码时最好用

  1. 代码
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-01-17 21:28 |只看该作者

请教高手!!!

rt 是局部变量
所以程序退出后
rt 所指向的地址就不存在了
所以返回值应该是随机的
不一定是0
甚至可能引起内存访问错误

论坛徽章:
0
4 [报告]
发表于 2003-01-17 21:30 |只看该作者

请教高手!!!

改正

1
可以把
char rt[20];
写成
static char rt[20];
但是如果这个函数不能用在多线程中

2
改函数定义
(int VarNo, int Value, int arrayno,char rt[])

论坛徽章:
0
5 [报告]
发表于 2003-01-17 21:48 |只看该作者

请教高手!!!

1,如果因为rt是局部变量而导致返回随即,那么C语言定义char *就没有意义了吧?那么如下的程序也应该出错了,我想。
#include <stdio.h>;
#include <stdlib.h>;
char *t1(void);
main()
{
  char *s;
  s=t1();
  printf("%s\n", s);
}
char *t1(void)
{
  char rt[20];
  sprintf(rt, "%d", 100);
  return rt;
}
经测试,s=100;正确。
2,函数形式是不能改的了。
程序的目的是提供外部接口,因此Put函数只需要设置全局变量VarPooInf,Get函数只是返回对应的VarPooInf。

谢谢你的帮助。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2003-01-17 21:49 |只看该作者

请教高手!!!

这样改一下就对了:

/******************************************************/
/* PutIntValue(Value) */
/* GetIntValue() */
/******************************************************/

#include <stdlib.h>;
#include <stdio.h>;
#include <string.h>;

#define VARARRAYNUM 2

typedef struct {
void *pb;
short int cb;/*pb*/
char kind;
}VAR_POOL_INF;

VAR_POOL_INF VarPoolInf[20]={{"abcd", 5, 'C'},
{"123.456", 6, 'D'},

{"xyzd iad ", 13, 'C'},
{"0987", 5, 'C'},

{NULL, 2, 'I'},
{"123.321", 15, 'D'},
};
char *GetIntValue(int VarNo, int arrayno);
int PutIntValue(int VarNo, int Value, int arrayno);


void main( void )
{
PutIntValue(2,2345,0);
printf("%s\n", GetIntValue(2,0));
}

int PutIntValue(int VarNo, int Value, int arrayno)
{
VAR_POOL_INF *tmp;
tmp=VarPoolInf+VarNo*VARARRAYNUM+arrayno;

tmp->;pb= new int;
// 老大!Value 是形式参数,它的地址怎么能可靠呢?
memcpy( tmp->;pb, &Value, sizeof(int) );
tmp->;cb=sizeof(int);
return 0;
}

char *GetIntValue(int VarNo, int arrayno)
{
VAR_POOL_INF *tmp;
static char rt[20];
// 局部变量也敢回传?胆子不小呀!
int *value;

tmp=VarPoolInf+VarNo*VARARRAYNUM+arrayno;

//memcpy( value, tmp->;pb, tmp->;cb );
value = (int *)tmp->;pb;

sprintf(rt, "%d", *value);
// 起先倒是对的,可是怎么又改错了?
delete tmp->;pb;
//千万不能忘了这一句
return rt;
}

批注:回家好好学学 C 的语法吧!

论坛徽章:
0
7 [报告]
发表于 2003-01-17 22:00 |只看该作者

请教高手!!!

大哥好厉害呀!!!小弟我太佩服了!!!
我是因为char* 忘了malloc,所以才。。。

我坚决支持flw当斑竹!!!


顺便问一下,怎么做才能让大哥你当斑竹呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2003-01-17 22:07 |只看该作者

请教高手!!!

不客气!
我 QQ:116544783
e-mail: wxh_net@163.com
csdn: wxhnet(思平)
有事可以找我。
只要大家支持,我一定会成为版主的!

论坛徽章:
0
9 [报告]
发表于 2003-01-17 22:30 |只看该作者

请教高手!!!

对于回传局部变量的看法:
如果说,要回传一个值,必须定义静态变量,那么这就不仅仅是C/C++的缺陷了。对于return来说,那还有什么意义呢,还不如都用指针的好。
教材上说,局部变量在函数调用结束后释放,那么函数调用什么时候结
束呢?当然是在return完成之后了,既然return还没有正确的完成,局部
变量当然还存在,因此,只有当局部变量完成了其值的回传之后,才消失,所以,我认为回传局部变量是没有错的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2003-01-17 22:37 |只看该作者

请教高手!!!

有错!
return 的时候 rt 确实可用,但是当你 return 完了之后就不可用了。
而这时候你还没有使用它,当你使用的时候,就已经不可用了。
需要注意的一点是,return 数组和 return 一个简单类型的变量不一样。
return 数组的时候,传回的只是指针,指针作为一个简单类型,
当然是有效的。但是指针所指向的东西可就不一定有效了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP