Chinaunix

标题: 如何把长整型赋给字符数组 [打印本页]

作者: netdoger    时间: 2013-01-08 10:49
标题: 如何把长整型赋给字符数组
我看到一本书上的写法(我把它简化了):
long addr;
char buf[4];
((long)&(buf[0]))=addr;
可是编译通不过,请问书上错了吗?能否改正?
作者: sonicling    时间: 2013-01-08 11:02
*((long *)&(buf[0]))=addr;
作者: cjaizss    时间: 2013-01-08 11:53
sonicling 发表于 2013-01-08 11:02
*((long *)&(buf[0]))=addr;

即便如此,其实也不对
作者: cokeboL    时间: 2013-01-08 11:56
回复 3# cjaizss


    why?字节序?
作者: cjaizss    时间: 2013-01-08 12:06
cokeboL 发表于 2013-01-08 11:56
回复 3# cjaizss

不,对齐
作者: crazy_snail    时间: 2013-01-08 12:45
cjaizss 发表于 2013-01-08 12:06
不,对齐


和对齐没什么关系吧。
作者: cjaizss    时间: 2013-01-08 12:55
crazy_snail 发表于 2013-01-08 12:45
和对齐没什么关系吧。

buf[0]地址可能是奇数边界
作者: crazy_snail    时间: 2013-01-08 13:00
cjaizss 发表于 2013-01-08 12:55
buf[0]地址可能是奇数边界


那也没问题啊
作者: cokeboL    时间: 2013-01-08 13:07
本帖最后由 cokeboL 于 2013-01-08 13:31 编辑

回复 8# crazy_snail


    ~看错了
作者: bruceteen    时间: 2013-01-08 13:09
回复 7# cjaizss
小白,某些CPU不允许非对齐的数据操作
在这种情况下,对于C/C++而言,是 禁止非对齐的操作
还是 允许但编译时用两条指令分段操作 ?

我没遇到过,故而一问

作者: crazy_snail    时间: 2013-01-08 13:14
回复 9# cokeboL

我的机器上没问题
[root@data1 ~]# gcc --version
gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
Copyright (C) 2006 Free Software Foundation, Inc.

作者: bruceteen    时间: 2013-01-08 13:16
cokeboL 发表于 2013-01-08 13:07
回复 8# crazy_snail
编译器不这么认为,vc2008上试了下中断了


我的也是VC2008,winxp系统,代码如下,但没死
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char buf[5] = { 0 };
  5.     *(long*)(buf+1) = 0x11223344;

  6.     printf( "%02hhX %02hhX %02hhX %02hhX %02hhX\n", buf[0], buf[1], buf[2], buf[3], buf[4] );

  7.     return 0;
  8. }
复制代码

作者: cokeboL    时间: 2013-01-08 13:28
回复 11# crazy_snail


    额,我打印错了。。
作者: cokeboL    时间: 2013-01-08 13:30
回复 12# bruceteen


    恩,我看错了

作者: socay2    时间: 2013-01-08 13:47
sprintf 不就搞定了么
作者: Cyberman.Wu    时间: 2013-01-08 13:51
编译器是无法知道待访问地址是否是对齐的,这个是程序员要干的事。

这个还有一个问题,在现在64bit系统越来越普及的情况下,long其实是64bit的值。
作者: cjaizss    时间: 2013-01-08 13:52
bruceteen 发表于 2013-01-08 13:09
回复 7# cjaizss
小白,某些CPU不允许非对齐的数据操作
在这种情况下,对于C/C++而言,是 禁止非对齐的操 ...

一般不会禁止
作者: ilogo1    时间: 2013-01-08 14:10
本帖最后由 ilogo1 于 2013-01-08 14:11 编辑
  1. typedef union long_struct
  2. {
  3.     long x;
  4.     char arr[sizeof(long)];
  5. }long;
  6. long l;
  7. l.x=value;
复制代码
封装一下
作者: liwangli1983    时间: 2013-01-08 16:15
CISC下一般能分两次取数据,就是性能低一些。但RISC下一般就直接报错了
作者: liuiang    时间: 2013-01-08 21:30
处理器会产生非对齐异常。所以要看操作系统,不过一般操作系统都不搭理这事,所以程序异常退出居多。貌似是这样。
作者: pmerofc    时间: 2013-01-08 21:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: leslielg    时间: 2013-01-14 09:50
long addr;
char buf[4];

这个buf紧跟着addr写的,地址分配也会顺着分配,不会出现奇地址的情况。

在ARM架构上,未对齐地址访问系统直接崩溃了,x86我没见到过。
作者: Cyberman.Wu    时间: 2013-02-04 13:57
回复 19# liwangli1983


    应该没有这种区分的,PowerPC就可以硬件直接访问非对齐的地址的(一些连续自动操作多个寄存器的指令除外)。这个就是要看具体用到的CPU是怎么设计的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2