结构指针返回成员问题

中联-ZXH 2008-03-26 05:30:06
我用结构指针Struct_A 做为函数Test 参数返回
结构中有5个char成员 两个long成员

另有一结构指针Struct_B
结构中5个char*成员 两个long成员,都分别有值

通过 strcpy(&Struct_A->char成员,Struct_B->成员);方式给每个成员赋值,long成员直接用 =赋值 。
在函数内部用MessageBox弹出,&Struct_A->char成员,Struct_B->成员都是正常的
该函数为API _stdcall方式提供之后
通过C++或其它语言,调用该函数之后,MessageBox弹出来,除long之外其它成员都是乱码
MessageBox(NULL,&Struct_A->char成员,"测试",0);


不知道为什么?请前辈指点,本人新手一名,谢谢。
...全文
311 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ptwcj 2008-03-27
  • 打赏
  • 举报
回复
mark
paidfighting 2008-03-27
  • 打赏
  • 举报
回复
使用字符指针char* p或者字符数组char array[N] (N大于等于你需要的长度) 就可以了
中联-ZXH 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 Supper_Jerry 的回复:]
对于一个char* p 类型来说。你取*p只是取了第一个字母而已。
所以你需要用strcpy来进行拷贝赋值。
[/Quote]

首先先谢谢各位
这里我是想通过这个转换API回传的结构成员是“字符串”
是我理解错误以为char就是字符串了
我想将*gpersonalinfo->pina赋给一个”字符串“,这个“字符串”我该怎么定义呢?怎么赋值呢?
ryfdizuo 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 paidfighting 的回复:]
ppersonalinfo_Out->pins=*gpersonalinfo->pina;
当然是只赋了首字母,直观讲就是,pins是一个char,你还想它保存多少东西?
[/Quote]

这才是关键的问题,如果pins的类型不改变,strcpy也会出错的.
Supper_Jerry 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 apiaoz 的回复:]
ppersonalinfo_Out->pins=*gpersonalinfo->pina

ppersonalinfo_Out是结构指针 ->pins是char成员

gpersonalinfo也是指针,pina是char*成员,*gpersonalinfo->pina代表的是指针所指向地址的值,为什么赋值没有意义呢?
[/Quote]
对于一个char* p 类型来说。你取*p只是取了第一个字母而已。
所以你需要用strcpy来进行拷贝赋值。
paidfighting 2008-03-27
  • 打赏
  • 举报
回复
ppersonalinfo_Out->pins=*gpersonalinfo->pina;

当然是只赋了首字母,直观讲就是,pins是一个char,你还想它保存多少东西?


*gpersonalinfo->pina表示的是指针所指向的值,没错,这时候如果你用它向一个char来赋值,就得到首字母

要得到全部可以使用指针赋值,char* p = gpersonalinfo->pina;这时p和gpersonalinfo->pina指向同一个地方

或者使用strcpy,则是拷贝字符串
中联-ZXH 2008-03-26
  • 打赏
  • 举报
回复
ppersonalinfo_Out->pins=*gpersonalinfo->pina

ppersonalinfo_Out是结构指针 ->pins是char成员

gpersonalinfo也是指针,pina是char*成员,*gpersonalinfo->pina代表的是指针所指向地址的值,为什么赋值没有意义呢?
中联-ZXH 2008-03-26
  • 打赏
  • 举报
回复
那该咋个赋值呢?
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
//很明显,你是通过malloc申请空间的,
gpersonalinfo->pina=(char*)malloc(1000);
gpersonalinfo->names=(char*)malloc(1000);
gpersonalinfo->sex=(char*)malloc(1000);
gpersonalinfo->birth=(char*)malloc(1000);
gpersonalinfo->workdate=(char*)malloc(1000);
gpersonalinfo->retiredate=(char*)malloc(1000);
gpersonalinfo->salary=0;
gpersonalinfo->annuity=0;
gpersonalinfo->areacode=(char*)malloc(1000);
gpersonalinfo->companyid=(char*)malloc(1000);

int* result=pic_personal_cm(0,gevn,gpersonalinfo);
if (result!=0)
{
MessageBox(NULL,"开始返回","Project.dll提示",0);

//这里的赋值有意义吗?只是将字符串的首字母赋给ppersonalinfo_Out里面的成员字符变量???
ppersonalinfo_Out->pins=*gpersonalinfo->pina;
cout < <*gpersonalinfo->names < <endl;
ppersonalinfo_Out->names=*gpersonalinfo->names;
cout < <ppersonalinfo_Out->names < <endl;
ppersonalinfo_Out->sexs=*gpersonalinfo->sex;
ppersonalinfo_Out->birth=*gpersonalinfo->birth;
ppersonalinfo_Out->workdate=*gpersonalinfo->workdate;
ppersonalinfo_Out->retiredate=*gpersonalinfo->retiredate;
ppersonalinfo_Out->salary=gpersonalinfo->salary;
ppersonalinfo_Out->annuity=gpersonalinfo->annuity;
ppersonalinfo_Out->areacode=*gpersonalinfo->areacode;
ppersonalinfo_Out->companyid=*gpersonalinfo->companyid;

//这里delete gpersonalinfo会造成内存丢失吧,应该先显示的将gpersonalinfo里面的5个char*指向的堆空间
// free掉,注意malloc申请的,只能用free,最后在delete gpersonalinfo;
delete gpersonalinfo;
中联-ZXH 2008-03-26
  • 打赏
  • 举报
回复
这个是最底层API,是我模仿提供商的API,主要原因是提供商的API在PB/VB中调用有问题(在PB/VB中不支持结构成员指针),我的目的是通过一个API将提供商的API中了结构指针中的成员由char*转成char(PB/VB支持结构ref,但不支持结构成员也是指针)
Project1.h
struct personalinfo_Out
{
char* pins;
char* names;
char* sexs;
char* birth;
char* workdate;
char* retiredate;
long salary;
long annuity;
char* areacode;
char* companyid;
};
struct icc_env
{
long readtype;
long cardtype;
long port;
long baud;
char pinn;
char keyy;
};
extern "C" int* __declspec(dllexport) _stdcall ic_personal_cm(long lngfalgop,icc_env* icc_env_In,personalinfo_Out* ppersonalinfo_Out);

Project1.cpp
int* _stdcall ic_personal_cm(long lngfalgop,icc_env* icc_env_In,personalinfo_Out* ppersonalinfo_Out)
{

strcpy(ppersonalinfo_Out->pins,"端口");
strcpy(ppersonalinfo_Out->names,"姓名");
strcpy(ppersonalinfo_Out->sexs,"性别");
strcpy(ppersonalinfo_Out->birth,"生日");
strcpy(ppersonalinfo_Out->workdate,"工作时间");
strcpy(ppersonalinfo_Out->retiredate,"出生时间");
ppersonalinfo_Out->salary=123;
ppersonalinfo_Out->annuity=321;
strcpy(ppersonalinfo_Out->areacode,"身份证");
strcpy(ppersonalinfo_Out->companyid,"单位");
MessageBox(NULL,"进入测试库","Project1.dll提示",0);
return (int*)123;
}


这是转换API,我的主要目的
Project.h
struct personalinfo_Out
{
char pins;
char names;
char sexs;
char birth;
char workdate;
char retiredate;
long salary;
long annuity;
char areacode;
char companyid;
};
struct icc_env
{
long readtype;
long cardtype;
long port;
long baud;
char pinn;
char keyy;
};
extern "C" int* __declspec(dllexport) _stdcall ic_personal_cm(long lngfalgop,icc_env* icc_env_In,personalinfo_Out* ppersonalinfo_Out);


Project.CPP
#include "Project.h"
#include <windows.h>
#include <iostream>
struct personalinfo
{
public:
char* pina;
char* names;
char* sex;
char* birth;
char* workdate;
char* retiredate;
long salary;
long annuity;
char* areacode;
char* companyid;
};
typedef int*(_stdcall *lpic_personal_cm)(long ,icc_env* ,personalinfo*);

using namespace std;

int* _stdcall ic_personal_cm(long lngfalgop,icc_env* icc_env_In,personalinfo_Out* ppersonalinfo_Out)
{
HINSTANCE hdll;
lpic_personal_cm pic_personal_cm;
hdll=LoadLibrary("Project1.dll");
if (hdll!=NULL)
{
pic_personal_cm=(lpic_personal_cm)GetProcAddress(hdll,"ic_personal_cm");
if (pic_personal_cm!=NULL)
{
icc_env* gevn=new icc_env;
personalinfo* gpersonalinfo=new personalinfo;

gevn->readtype=icc_env_In->readtype;
gevn->cardtype=icc_env_In->cardtype;
gevn->port=icc_env_In->port;
gevn->baud=icc_env_In->baud;
gevn->pinn=icc_env_In->pinn;
gevn->keyy =icc_env_In->keyy;

gpersonalinfo->pina=(char*)malloc(1000);
gpersonalinfo->names=(char*)malloc(1000);
gpersonalinfo->sex=(char*)malloc(1000);
gpersonalinfo->birth=(char*)malloc(1000);
gpersonalinfo->workdate=(char*)malloc(1000);
gpersonalinfo->retiredate=(char*)malloc(1000);
gpersonalinfo->salary=0;
gpersonalinfo->annuity=0;
gpersonalinfo->areacode=(char*)malloc(1000);
gpersonalinfo->companyid=(char*)malloc(1000);

int* result=pic_personal_cm(0,gevn,gpersonalinfo);
if (result!=0)
{
MessageBox(NULL,"开始返回","Project.dll提示",0);

ppersonalinfo_Out->pins=*gpersonalinfo->pina;
cout<<*gpersonalinfo->names<<endl;
ppersonalinfo_Out->names=*gpersonalinfo->names;
cout<<ppersonalinfo_Out->names<<endl;
ppersonalinfo_Out->sexs=*gpersonalinfo->sex;
ppersonalinfo_Out->birth=*gpersonalinfo->birth;
ppersonalinfo_Out->workdate=*gpersonalinfo->workdate;
ppersonalinfo_Out->retiredate=*gpersonalinfo->retiredate;
ppersonalinfo_Out->salary=gpersonalinfo->salary;
ppersonalinfo_Out->annuity=gpersonalinfo->annuity;
ppersonalinfo_Out->areacode=*gpersonalinfo->areacode;
ppersonalinfo_Out->companyid=*gpersonalinfo->companyid;
delete gpersonalinfo;
FreeLibrary(hdll);
return (int*)0;}
else
{MessageBox(NULL,"返回失败","中联转换",0);
return (int*)-1;}
delete gpersonalinfo;
}
else
{return (int*)-1;}
FreeLibrary(hdll);
}
else
{
MessageBox(NULL,"动态库加载失败","中联读卡转换",0);
return (int*)-1;
}
}
Supper_Jerry 2008-03-26
  • 打赏
  • 举报
回复
cout < <*Struct_B->成员
这句也是乱码的话,只能说明结构体Struct_B里面的数据
有问题啊。贴全代码吧。
中联-ZXH 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Supper_Jerry 的回复:]
在赋值之前 cout < <*Struct_B->成员
Struct_A->char成员 = *Struct_B->成员;之后
cout < Struct_A->char成员 看看是不是乱码。
MessageBox(NULL,,&Struct_A->char成员"测试",0); 也是乱码
这句话有问题。不能用&Struct_A->char成员
[/Quote]
都是乱码
中联-ZXH 2008-03-26
  • 打赏
  • 举报
回复
Struct_b->成员是这样赋值的
strcpy(Struct_b->成员,"测试");
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
最关键的就是你的Struct_b->成员指针是怎么赋值的?
里面存法的是什么?字符,字符串?
Supper_Jerry 2008-03-26
  • 打赏
  • 举报
回复
在赋值之前 cout < <*Struct_B->成员
Struct_A->char成员 = *Struct_B->成员;之后
cout < Struct_A->char成员 看看是不是乱码。
MessageBox(NULL,,&Struct_A->char成员"测试",0); 也是乱码
这句话有问题。不能用&Struct_A->char成员
中联-ZXH 2008-03-26
  • 打赏
  • 举报
回复
Struct_A->char成员 = *Struct_B->成员;这种方式
我用 cout < <Struct_A->char成员;输出也是乱码
用MessageBox(NULL,&Struct_A->char成员,"测试",0); 也是乱码
为什么呢
不存在数组
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
此时:aTest.ch=*pTest.p;
只能将pTest.p的第一个元素付给aTest.ch
夜雨_倚琴 2008-03-26
  • 打赏
  • 举报
回复
char是一个byte
char*是4个byte
大哥。
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
	
//这样子问题就有了:
char *p = new char[5]; //字符串数组;
pA pTest;
pTest.p= p;

A aTest;
aTest.ch=*pTest.p;
cout<<aTest.ch<<endl;

delete [] p;
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复

这样子没有问题;
struct A
{
char ch;
};
struct pA
{
char* p;
};

int main()
{
char *p = new char;
pA pTest;
pTest.p= p;

A aTest;
aTest.ch=*pTest.p;

delete p;
}
加载更多回复(7)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧