首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问个:指针被强制转化到结构体有关问题

2012-03-03 
请教个:指针被强制转化到结构体问题#pragmapack(1)typedefstructmage{charhead//一个字节intheadl//四个

请教个:指针被强制转化到结构体问题
#pragma   pack   (1)
typedef   structmage
{
  char     head;     //一个字节                              
  int       headl;   //四个字节      
  char     data;     //一个字节                            
}my_mage
my_mage   *my_ge;
char   *buffs;
buffs=   (char   *)calloc(sizeof(char),20);
memcpy....;//在这个地方给buffs,赋值
my_ge=(   my_mage   *)buffs;       //强制转换结构体

问题是:
char   *data;
data=&my_ge-> data;//是对应从5个字节以后的数据的地址么?
my_ge-> data;//只对应第5个字节,

[解决办法]
data=&my_ge-> data;//是对应从5个字节以后的数据的地址么?
==========
data == buffs+5

my_ge-> data;//只对应第5个字节
=============
第6个字节吧
[解决办法]
data=&my_ge-> data;//是对应从5个字节以后的数据的地址么?
应该是这样的,你可以测试一下:
附上我的测试代码:
#pragma pack (1)
typedef structmage
{
char head; //一个字节
int headl; //四个字节
char data; //一个字节
}my_mage;

int main(void)
{

my_mage *my_ge;
char *buffs;
buffs= (char *)calloc(sizeof(char),20);
memcpy(buffs, "1234567890123456789 ",20);//....;//在这个地方给buffs,赋值
my_ge=( my_mage *)buffs; //强制转换结构

char *data;
data=&my_ge-> data;//是对应从5个字节以后的数据的地址么?
//my_ge-> data;//只对应第5个字节,
cout < <data < <endl;

//system( "pause ");
return 0;
}
输出为67890123456789
[解决办法]
請問一下樓上各位用的什么編譯器呢,
我在vc6.0下用new給buffer分配空間后my_ge=( my_mage *)buffs; //强制转换结构是通不過的,另外根據對齊my_ge-> data應該是第9個字節吧?,比如
#include <iostream>
#include <string>
using namespace std;
typedef struct
{
char a;
int b;
char c;
char d[5];
}data1;
int main()
{
data1 *p;
p=new data1;
memcpy(p, "1234567890 ",10);
cout < <p-> c < <endl;
char *q=&p-> c;
cout < <q < <endl;
return 0;
}
則分別輸出9及其以后的值
[解决办法]
ls 的我用的也是vc6,请注意#pragma pack (1)这个对齐是按1字节对齐了
[解决办法]
哦,非常感謝樓上的,我還不知道有這個東西,看到個#就沒仔細看了
[解决办法]
順便請問一下樓上的,既然有默認的隊齊規則,哪這種指定按几個字節對齊的做法又有什么作用呢?
[解决办法]
#pragma pack (1)就是按一字节对齐了
你想指的内存是BUFF + 5

热点排行