2013-12-19 86 views
-1

我不知道为什么会发生这种情况,我想我正在做所有事情。也许有人可以帮助我指出正确的方向。不兼容指针类型的作业

unsigned short* x; 

    int textLeft[16]; 

    x = shm->textLeft; 

这些在程序中间隔出来,所以我不想复制一堆代码,但如果需要更多,请让我知道。

没有给我不兼容的指针类型,不应该这样工作吗?

+2

什么是shm?它是如何定义的?如果它是'int textLeft [16]',那么这是正常的,'unsigned short *'与'signed int []'不一样' – Eregrith

+0

struct Shared * shm; – user2318083

回答

2

不,这不应该工作,因为你分配一个int*值的unsigned short*变量,它会导致每个的C strict aliasing rule未定义行为。

,使这项工作在不改变类型的方法是

  1. 转换指针,x = (unsigned short *)(shm->textLeft);
  2. 与海湾合作委员会的-fno-strict-aliasing编译打开走样规则了。

但是真的,我强烈建议你将类型改为兼容,否则你会将自己绑定到单个编译器对C标准的扩展。

+0

+1在C中,类型错误并不存在,只是你没有足够的东西。 – 2013-12-19 11:17:50

+1

@HermanTorjussen:类型错误确实存在;如果没有'-fno-strict-aliasing'(一个GCC特定的选项),编译器可以自由地以任何方式打破这个代码。 –

+0

这就是我对幽默的尝试..我的观点是C对类型不是很严格。 – 2013-12-19 11:20:37

1
`unsigned short` 

不是

`int` 

所以限定

  • x作为int *
  • textLeft[16]unsigned short

和事情都很好。

+0

你说得对,我以为我曾经这样做过,但是它处理了错误。但我记得现在我从别的东西得到另一个错误。在做int之前,我得到一个“无效的参数”,但它没有。 – user2318083

1

在你的情况下,x是一个无符号短指针,textLeft是一个有符号整数。您正尝试将有符号整数地址分配给无符号短指针。