2016-12-29 38 views
4

是否可移植/有效的C取消引用被视为地址的整数文字?即,如果我想在存储器地址0x12345678一个64位的值设置为123,是以下便携式和有效的C,至少由C89标准:适用于取消引用C中的整数指针字面值文字

*(uint64_t *)(0x12345678) = 123ULL; 

我认为没有编译警告(通过gcc -std=c89 -Wall input.c测试) ,但我记得在某些情况下,在将某个地址存储在一个中间变量而不是直接取消引用整数文字(已被转换为指针地址)的情况下,在这个主题上看到了一个问题。

+0

你是什么意思便携式?我唯一一次做这样的事情就是在为嵌入式系统编程的时候,我确信我会在那个地址中找到。除此之外,没有可移植性。 – DeiDei

回答

3

只要地址0x12345678有效且具有uint64_t对象,则转换或直接使用整数都没有问题。但它可能不是所有平台中的有效地址。所以,如果你知道你在处理什么,那很好。

仅在C99中引入了固定宽度类型。所以,当你在C89中询问关于可移植性到uint64_t*的问题时,我发现它是自相矛盾的:)

+0

固定宽度类型的好处。谢谢(你的)信息。 – DevNull

+0

附录:在大多数C89系统/编译器中根本没有* portable *的方式来获取64位整数(因为'long long'当时不存在,'long'通常是32位)。有些编译器通过(比如说)'__int64'来扩展它,但是相同的编译器通常会扩展C89和'',所以不妨使用它。或者,甚至更便携:定义'types.h'定义'MYuint64'或类似的(使用'long long','','unsigned __int64'或任何其他可用的)。 –