[讨论] 关于C语言的一个小问题。

739669351   2017-3-20 16:16 楼主
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;
}


有错吗  有错吗?  为什么?

回复评论 (25)

就像红色标记的一样,等式两边参数类型不一样
点赞  2017-3-20 16:33
char类型指针不能等于无符号结构体指针?  加强制转换看看,或者加个中间变量强制转换一下
点赞  2017-3-20 16:36
完全看不懂,忘记这门语言了
亮化工程公司 http://www.dartled.com
点赞  2017-3-20 16:47
首先一个错误就是 str=ar;虽然两个都是指针,但是所指向的变量类型却不一样,是不能这样直接赋值的,需要进行一下类型强制转换,改为str=(struct S1*)ar;就可以了,至于最后打印出来的值也不是顺序打印出来的,这跟访问字/字节对齐相关
点赞  2017-3-20 17:05
其实稍微给程序多加几条打印 你的问题就能自己知道答案了 指针不管是什么类型的,都是可以访问内存的,只不过要按照定义的类型去访问罢了 红色标记是可以通过编译的,只是编译器会给你条警告信息 (这种警告不可小觑,这里只是照着你的代码来,真要这么干,一定要转换) 将你的代码做个小小测试 touch 1.c 输入完 ,然后cat 一下 QQ截图20170320170606.png 如果你不懂 就好好学习C语言吧 如果以后还想踏入这行 内功一定要修炼好 将这段代码编译一下 我用的GUN的Gcc工具 QQ截图20170320170707.png 结果应该很清楚了 如果你C语言还可以的话 看图片 你还懒得自己输入这些代码 我就给你这源码和生成的exe文件 点击就能运行
测试源码.rar (13.33 KB)
(下载次数: 12, 2017-3-20 17:18 上传)
本帖最后由 ywlzh 于 2017-3-20 17:19 编辑
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2017-3-20 17:12
不懂,没有玩过这么复杂的C语言,太复杂的语言用法都不懂
点赞  2017-3-20 17:21
引用: ywlzh 发表于 2017-3-20 17:12
其实稍微给程序多加几条打印 你的问题就能自己知道答案了

指针不管是什么类型的,都是可以访问内存的, ...

大哥要不要这么彪,但还是感谢。这个问题不是简单的一个数据类型不对称造成的。你现在是GCC编译器正常,我在Linux下编译也正常因为它也是GCC但是你换其他的编译器试试。那就不是一个简单的警告了。比如DEV
点赞  2017-3-20 17:45
引用: 低调的路人 发表于 2017-3-20 16:33
就像红色标记的一样,等式两边参数类型不一样

对是这个问题。
点赞  2017-3-20 17:45
引用: 低调的路人 发表于 2017-3-20 16:33
就像红色标记的一样,等式两边参数类型不一样

但是在stm32 下编译没办法通过 在WinTV下正常。强制转化数据错乱  字节对其问题造成的
点赞  2017-3-20 17:47
引用: yl20084784 发表于 2017-3-20 16:36
char类型指针不能等于无符号结构体指针?  加强制转换看看,或者加个中间变量强制转换一下

强制转换  数据错位   字节对其问题
点赞  2017-3-20 17:47
引用: dart18 发表于 2017-3-20 16:47
完全看不懂,忘记这门语言了

哈哈
点赞  2017-3-20 17:47
引用: bobde163 发表于 2017-3-20 17:05
首先一个错误就是 str=ar;虽然两个都是指针,但是所指向的变量类型却不一样,是不能这样直接赋值的,需要进 ...

数据顺序错误 字节对其问题
点赞  2017-3-20 17:48
引用: 739669351 发表于 2017-3-20 17:45 大哥要不要这么彪,但还是感谢。这个问题不是简单的一个数据类型不对称造成的。你现在是GCC编译器正常, ...
哎 跟你说了要转换 还有什么好纠结的呢? QQ截图20170320180634.png 用的MDK stm32的工程添加进去的 如果看不到下面编译结果 说你什么好 这就是编译 还没看到结果 等会 我再用RTT试试看结果 本帖最后由 ywlzh 于 2017-3-20 18:15 编辑
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2017-3-20 18:08
你要先看看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 编辑
点赞  2017-3-21 09:37
错了,对齐之下,不止10个字节
点赞  2017-3-21 11:19
引用: strong161 发表于 2017-3-20 17:21
不懂,没有玩过这么复杂的C语言,太复杂的语言用法都不懂

这还叫复杂?
强者为尊,弱者,死无葬身之地
点赞  2017-3-21 11:21
引用: axbin 发表于 2017-3-21 09:37
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对 ...

正解 。
点赞  2017-3-21 11:39
引用: axbin 发表于 2017-3-21 09:37
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对 ...

正解 。
点赞  2017-3-21 11:40
引用: axbin 发表于 2017-3-21 09:37
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对 ...

咋发不了表情
点赞  2017-3-21 11:40
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复