首页上一页 1 下一页尾页 1 条记录 1/1页
《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大小时,它并不包括在内)
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大小时,它并不包括在内)