请教个:指针被强制转化到结构体问题
#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