社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1271|回复: 25

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

[复制链接]

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-3-20 16:16:32 | 显示全部楼层 |阅读模式
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;
}


有错吗  有错吗?  为什么?

此帖出自编程基础论坛


回复

使用道具 举报

129

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-3-20 16:33:18 | 显示全部楼层
就像红色标记的一样,等式两边参数类型不一样


回复

使用道具 举报

518

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-3-20 16:36:50 | 显示全部楼层
char类型指针不能等于无符号结构体指针?  加强制转换看看,或者加个中间变量强制转换一下


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-3-20 16:47:14 | 显示全部楼层
完全看不懂,忘记这门语言了
亮化工程公司 http://www.dartled.com


回复

使用道具 举报

1636

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2017-3-20 17:05:03 | 显示全部楼层
首先一个错误就是 str=ar;虽然两个都是指针,但是所指向的变量类型却不一样,是不能这样直接赋值的,需要进行一下类型强制转换,改为str=(struct S1*)ar;就可以了,至于最后打印出来的值也不是顺序打印出来的,这跟访问字/字节对齐相关


回复

使用道具 举报

1225

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-3-20 17:12:41 | 显示全部楼层
本帖最后由 ywlzh 于 2017-3-20 17:19 编辑

其实稍微给程序多加几条打印 你的问题就能自己知道答案了

指针不管是什么类型的,都是可以访问内存的,只不过要按照定义的类型去访问罢了

红色标记是可以通过编译的,只是编译器会给你条警告信息 (这种警告不可小觑,这里只是照着你的代码来,真要这么干,一定要转换)

将你的代码做个小小测试  touch 1.c 输入完 ,然后cat 一下

QQ截图20170320170606.png

如果你不懂 就好好学习C语言吧 如果以后还想踏入这行 内功一定要修炼好

将这段代码编译一下 我用的GUN的Gcc工具

QQ截图20170320170707.png

结果应该很清楚了 如果你C语言还可以的话

看图片 你还懒得自己输入这些代码 我就给你这源码和生成的exe文件 点击就能运行
测试源码.rar (13.33 KB, 下载次数: 12)
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友


回复

使用道具 举报

2397

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-3-20 17:21:16 | 显示全部楼层
不懂,没有玩过这么复杂的C语言,太复杂的语言用法都不懂

点评

这还叫复杂?  详情 回复 发表于 2017-3-21 11:21


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-20 17:45:26 | 显示全部楼层
ywlzh 发表于 2017-3-20 17:12
其实稍微给程序多加几条打印 你的问题就能自己知道答案了

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

大哥要不要这么彪,但还是感谢。这个问题不是简单的一个数据类型不对称造成的。你现在是GCC编译器正常,我在Linux下编译也正常因为它也是GCC但是你换其他的编译器试试。那就不是一个简单的警告了。比如DEV

点评

哎 跟你说了要转换 还有什么好纠结的呢? [attachimg]290083[/attachimg] 用的MDK stm32的工程添加进去的 如果看不到下面编译结果 说你什么好  详情 回复 发表于 2017-3-20 18:08


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-20 17:45:53 | 显示全部楼层
低调的路人 发表于 2017-3-20 16:33
就像红色标记的一样,等式两边参数类型不一样

对是这个问题。


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-20 17:47:04 | 显示全部楼层
低调的路人 发表于 2017-3-20 16:33
就像红色标记的一样,等式两边参数类型不一样

但是在stm32 下编译没办法通过 在WinTV下正常。强制转化数据错乱  字节对其问题造成的


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-20 17:47:30 | 显示全部楼层
yl20084784 发表于 2017-3-20 16:36
char类型指针不能等于无符号结构体指针?  加强制转换看看,或者加个中间变量强制转换一下

强制转换  数据错位   字节对其问题

点评

那是字节序的问题,强制转换本身是没问题的。 所以,老衲一般是不推荐干这种事的。 如果你真的很想玩这个,建议你首先搞清楚字节序。(但这种真不好,它相当于依赖数据源和数据流向地方的字节序一致)  详情 回复 发表于 2017-8-11 09:39


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-20 17:47:49 | 显示全部楼层
dart18 发表于 2017-3-20 16:47
完全看不懂,忘记这门语言了

哈哈


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-20 17:48:26 | 显示全部楼层
bobde163 发表于 2017-3-20 17:05
首先一个错误就是 str=ar;虽然两个都是指针,但是所指向的变量类型却不一样,是不能这样直接赋值的,需要进 ...

数据顺序错误 字节对其问题


回复

使用道具 举报

1225

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-3-20 18:08:39 | 显示全部楼层
本帖最后由 ywlzh 于 2017-3-20 18:15 编辑
739669351 发表于 2017-3-20 17:45
大哥要不要这么彪,但还是感谢。这个问题不是简单的一个数据类型不对称造成的。你现在是GCC编译器正常, ...

哎 跟你说了要转换 还有什么好纠结的呢?
QQ截图20170320180634.png

用的MDK stm32的工程添加进去的  如果看不到下面编译结果 说你什么好

这就是编译 还没看到结果 等会 我再用RTT试试看结果

点评

如果没有设置字节对其问题 数据是错的  详情 回复 发表于 2017-3-21 11:42
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友


回复

使用道具 举报

18

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-3-21 09:37:08 | 显示全部楼层
本帖最后由 axbin 于 2017-3-21 10:26 编辑

你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对齐方式.
对齐是指每个成员最少占多少字节,你的char还不知道占几个字节呢
//    结构体成员的对齐方式
//      <1>. 自然对齐:按照最大的成员对齐
//      <2>. #pragma pack(n):取最大的成员和n,哪个较小以哪个对齐
//      <3>. __packed:紧挨着保存,单字节对齐,相当于#pragma pack(1)
//      <4>. 一般默认情况是 #pragma pack(8),以最大的成员和8,取较小的对齐,基本上都是以最大成员对齐的

点评

咋发不了表情  详情 回复 发表于 2017-3-21 11:40
正解 。  详情 回复 发表于 2017-3-21 11:40
正解 。  详情 回复 发表于 2017-3-21 11:39


回复

使用道具 举报

7601

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-3-21 11:19:50 | 显示全部楼层
错了,对齐之下,不止10个字节


回复

使用道具 举报

7601

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-3-21 11:21:05 | 显示全部楼层
strong161 发表于 2017-3-20 17:21
不懂,没有玩过这么复杂的C语言,太复杂的语言用法都不懂

这还叫复杂?
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-21 11:39:50 | 显示全部楼层
axbin 发表于 2017-3-21 09:37
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对 ...

正解 。


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-21 11:40:01 | 显示全部楼层
axbin 发表于 2017-3-21 09:37
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对 ...

正解 。


回复

使用道具 举报

72

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-21 11:40:53 | 显示全部楼层
axbin 发表于 2017-3-21 09:37
你要先看看sizeof(struct S1)默认大小是多少,这个和编译环境有关,也可以通过伪指令#pragma pack(n)指定对 ...

咋发不了表情


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-12-19 06:11 , Processed in 0.640246 second(s), 26 queries , Redis On.

快速回复 返回顶部 返回列表