我不知道为什么会发生这种情况,我想我正在做所有事情。也许有人可以帮助我指出正确的方向。不兼容指针类型的作业
unsigned short* x;
int textLeft[16];
x = shm->textLeft;
这些在程序中间隔出来,所以我不想复制一堆代码,但如果需要更多,请让我知道。
没有给我不兼容的指针类型,不应该这样工作吗?
我不知道为什么会发生这种情况,我想我正在做所有事情。也许有人可以帮助我指出正确的方向。不兼容指针类型的作业
unsigned short* x;
int textLeft[16];
x = shm->textLeft;
这些在程序中间隔出来,所以我不想复制一堆代码,但如果需要更多,请让我知道。
没有给我不兼容的指针类型,不应该这样工作吗?
不,这不应该工作,因为你分配一个int*
值的unsigned short*
变量,它会导致每个的C strict aliasing rule未定义行为。
,使这项工作在不改变类型的方法是
x = (unsigned short *)(shm->textLeft);
和-fno-strict-aliasing
编译打开走样规则了。但是真的,我强烈建议你将类型改为兼容,否则你会将自己绑定到单个编译器对C标准的扩展。
+1在C中,类型错误并不存在,只是你没有足够的东西。 – 2013-12-19 11:17:50
@HermanTorjussen:类型错误确实存在;如果没有'-fno-strict-aliasing'(一个GCC特定的选项),编译器可以自由地以任何方式打破这个代码。 –
这就是我对幽默的尝试..我的观点是C对类型不是很严格。 – 2013-12-19 11:20:37
`unsigned short`
不是
`int`
所以限定
x
作为int *
或textLeft[16]
如unsigned short
和事情都很好。
你说得对,我以为我曾经这样做过,但是它处理了错误。但我记得现在我从别的东西得到另一个错误。在做int之前,我得到一个“无效的参数”,但它没有。 – user2318083
在你的情况下,x
是一个无符号短指针,textLeft
是一个有符号整数。您正尝试将有符号整数地址分配给无符号短指针。
什么是shm?它是如何定义的?如果它是'int textLeft [16]',那么这是正常的,'unsigned short *'与'signed int []'不一样' – Eregrith
struct Shared * shm; – user2318083