struct S1{
unsigned char a;
unsigned short b;
unsigned char c;
unsigned long d;
};
char ar[10]={0xaa,0x01,0x03,0x12,0xfb,0xaa,0x01,0x03,0x12,0xfb};
int main(void)
{
struct S1 *str, stru;
str=ar;
stru.a =str->a;
stru.b =str->b;
stru.c =str->c;
stru.d =str->d;
// memcpy(&stru,str,sizeof(struct S1));
printf("stru->a=%x\nstru->b=%x\nstru->c=%x\nstru->d=%x\n",stru.a,stru.b,stru.c,stru.d);
return 0;
}
有错吗 有错吗? 为什么?
char类型指针不能等于无符号结构体指针? 加强制转换看看,或者加个中间变量强制转换一下
完全看不懂,忘记这门语言了
亮化工程公司 http://www.dartled.com
首先一个错误就是 str=ar;虽然两个都是指针,但是所指向的变量类型却不一样,是不能这样直接赋值的,需要进行一下类型强制转换,改为str=(struct S1*)ar;就可以了,至于最后打印出来的值也不是顺序打印出来的,这跟访问字/字节对齐相关
其实稍微给程序多加几条打印 你的问题就能自己知道答案了
指针不管是什么类型的,都是可以访问内存的,只不过要按照定义的类型去访问罢了
红色标记是可以通过编译的,只是编译器会给你条警告信息 (这种警告不可小觑,这里只是照着你的代码来,真要这么干,一定要转换)
将你的代码做个小小测试 touch 1.c 输入完 ,然后cat 一下
如果你不懂 就好好学习C语言吧 如果以后还想踏入这行 内功一定要修炼好
将这段代码编译一下 我用的GUN的Gcc工具
结果应该很清楚了 如果你C语言还可以的话
看图片 你还懒得自己输入这些代码 我就给你这源码和生成的exe文件 点击就能运行
测试源码.rar
(13.33 KB)
(下载次数: 12, 2017-3-20 17:18 上传)
本帖最后由 ywlzh 于 2017-3-20 17:19 编辑
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
不懂,没有玩过这么复杂的C语言,太复杂的语言用法都不懂
大哥要不要这么彪,但还是感谢。这个问题不是简单的一个数据类型不对称造成的。你现在是GCC编译器正常,我在Linux下编译也正常因为它也是GCC但是你换其他的编译器试试。那就不是一个简单的警告了。比如DEV
但是在stm32 下编译没办法通过 在WinTV下正常。强制转化数据错乱 字节对其问题造成的
哎 跟你说了要转换 还有什么好纠结的呢?
用的MDK stm32的工程添加进去的 如果看不到下面编译结果 说你什么好
这就是编译 还没看到结果 等会 我再用RTT试试看结果
本帖最后由 ywlzh 于 2017-3-20 18:15 编辑
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对齐方式.
对齐是指每个成员最少占多少字节,你的char还不知道占几个字节呢
// 结构体成员的对齐方式
// <1>. 自然对齐:按照最大的成员对齐
// <2>. #pragma pack(n):取最大的成员和n,哪个较小以哪个对齐
// <3>. __packed:紧挨着保存,单字节对齐,相当于#pragma pack(1)
// <4>. 一般默认情况是 #pragma pack(8),以最大的成员和8,取较小的对齐,基本上都是以最大成员对齐的
本帖最后由 axbin 于 2017-3-21 10:26 编辑