《Visual C++开发实战宝典》例17.8文件发送客户端(续)
发表在C语言图书答疑 2011-02-21
是否精华
版块置顶:
上次提问:  
class CDataPackage
{
public:
DataPackage m_Type; //数据包类型
SendCmd m_Cmd; //文件发送命令
DWORD m_dwSize; //数据报结构大小
DWORD m_dwFileSize; //整个文件大小
DWORD m_dwData; //m_Data的大小
BYTE m_Data[]; //数据缓冲区
};

在void CSendFileClientDlg::RecvFile(CDataPackage *pPackage)函数中有:
if (pPackage != NULL)
{
if (pPackage->m_Type == DP_FILE) //只处理文件数据
{
static CFile file; 
if (pPackage->m_Cmd == SC_BEGIN) //开始发送
{
//读取文件名
char szFileName[128] = {0};
memcpy(szFileName, pPackage->m_Data, 128);
我想在memcpy(szFileName, pPackage->m_Data, 128)这条语句中pPackage->m_Data应该是指向存储文件名的首地址,可是为什么它是指向文件名的首地址呢?从来没有把首地址赋值给m_Data,在例17.7与例17.8中都没有为m_Data赋值啊?他们的存储顺序应该是CDataPackage(m_Type,m_Cmd,m_dwSize,m_dwFileSize,m_dwData,m_Data[])->文件名->文件数据,为什么m_Data会指向文件名的首地址?为什么不指向其他地址呢? 


上次回复:
pPackage->m_Data的具体数据含义是由数据包中的pPackage->m_Cmd成员来确定的。可以看一下服务器端的发送代码



最新提问:
你讲的我都明白,你误解了我的意思,为了更精确表达我的意思,我举个类似的例子吧,如下:
class pointC
{
public:
int a;
int b;
char c[];
};

pointC k;
cout<<"pointC类的大小"<<endl;
cout<<sizeof(pointC)<<endl;
得:
此类的大小为8字节

cout<<"pointC 类成员地址"<<endl;
cout<<"k的地址"<<&k<<endl;
cout<<"k.a的地址"<<&k.a<<endl;
cout<<"k.b的地址"<<&k.b<<endl;
cout<<"k.c的地址"<<&k.c <<endl;
cout<<endl;
得:
pointC 类成员地址
k的地址0X0012FF64
k.a的地址0X0012FF64
k.b的地址0X0012FF68
k.c的地址0X0012FF6C
可见此类中char c[]的地址已经在类的范围之外,并且是类外的第一个地址,这和CDataPackage
类中m_Data[]很相似,就以我的例子提问:
为什么char c[]的地址不在类中,而是类外的第一个地址?
char c[]不是类的成员吗?计算pointC类大小时,char c[]为什么不包括在内?(这和m_Data[]很相似,
m_Data[]好像也是CDataPackage类外的第一个地址,计算CDataPackage大小时,它并不包括在内)



分享到:
精彩评论 1
songkun
学分:0 LV1
2011-02-25
沙发
类中成员和方法的地址 实际是相对于this 地址的偏移量
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照