今天看到一个关于网络的程序,里面有这样一个类型转换,我把问题简化一下
#include "iostream.h"
class test
{
public:
int i;
int j;
};void main()
{
test *p;
char s[100]="1";
          p=(test *)s;
cout<<p->i<<endl;
}
他就是这样转换的,这样行吗,
char s[100]="1";
          p=(test *)s;
s里面的值可以赋值到i中,但怎么能赋值到j中了,当然了他test里面有很多类型,不止我里面的i,j
还有一点,他是用 
char pBuffer[BURRER_SIZE];
recv(sock,pBuffer,BURRER_SIZE,0);
IPHEADER * pIpHdr;
pIpHdr = (IPHEADER *)pBuffer;
IPHEADER是他自定义的结构体,然后别人就开始使用了pIpHdr->SourceAddress=等
既然是他自己定义的结构体,而且又是通过pBuffer强制转换的,他怎么知道pIpHdr->SourceAddress是代表源ip地址了

解决方案 »

  1.   

    char pBuffer[BURRER_SIZE];
    IPHEADER * pIpHdr;
    pIpHdr = (IPHEADER *)pBuffer;就相当于为结构体pIpHdr在堆栈上分配了BURRER_SIZE大小的控件,指针类型可以任意转换,都是4个字节的。指针指向的内容就按指针实际的类型来取值了
      

  2.   

    只是分配一块内存 只要大小足够就没什么问题
    因为char x[100]; (test*)x实际上和你写
    (test*)maclloc(sizeof(BYTE) * 100);没区别
      

  3.   

    不只是分配内存吧
    但是把char里面的字符窜拷贝到test类中是什么原理呢
    我的那个模拟程序,怎么才能让j得到值呢,现在只有i得到了值,如果char s[100]="123";
    j中还是没有值
      

  4.   

    不只是分配内存吧,char里面的值也传到了test的成员变量里
    那这是什么原理呢,在我上面那个程序中,i得到了s的值
    但怎么让 j 也得到s的值了,即使char s[100]="123";也不能让 j 得到值
      

  5.   

    不只是分配内存吧,char里面的值也传到了test的成员变量里
    那这是什么原理呢,在我上面那个程序中,i得到了s的值
    但怎么让 j 也得到s的值了,即使char s[100]="123";也不能让 j 得到值
      

  6.   

    你要这么看,拿你上面的例子来说,你的结构体中有2个int类型的成员,一个int占4个字节,你的s[100] = "123",长度为strlen(s) = 3, a[0]='1',a[1]='2',a[2]='3';之后的a[3...99]='0';即3个字节,不足4个,所以你的结构体里的j成员就是'0',而你的i成员的值是将"123"放入他的内存中,'1'(a[0])放入i对应的内存空间的第一个字节,'2'(a[1])放入第二个字节,'3'(a[2])放在第三个字节中,i成员的第四个字节(即它最高位)就放了'0'(a[3]),所以i成员的内存中的数据就是32 31 30(字符'1'对应的是十六进制的30H,'1'对应的是31H,'2'对应的是32H),所以转成十进制数就是3355185,而j的值仍然是0;lz可以将s数组的长度加到4位以后,可以看到j值的变化