是否有与指针大小相同的整数类型?在所有微体系结构上都有保证?
发布于 2009-02-02 10:51:21
根据this Wikipedia page的说法,在C99中,您的stdint.h头可能会声明intptr_t和uintptr_t,但这当然需要
选择实现标准的这一可选部分的
所以总的来说,我认为这是一个困难的问题。
发布于 2009-02-02 10:59:34
简单地说,不是。不能保证在所有体系结构上都有。
我的问题是:为什么?如果你想分配一个足够大的类型来存储一个void*,最好的分配方法是(令人惊讶的是:-)一个void*。为什么需要将其放在int中
编辑:根据您对重复问题的评论,您希望存储指针(1,2,3)的特殊值,以指示额外信息。
不!!不要这样做!!。不能保证1、2和3不是完全有效的指针。在需要在4字节边界上对齐指针的系统中可能就是这种情况,但是,由于您询问了所有体系结构,因此我假设您具有较高的可移植性。
找一种正确的方法来做这件事。例如,使用union (来自内存的语法可能是错误的):
typedef struct {
int isPointer;
union {
int intVal;
void *ptrVal;
}
} myType;然后,您可以使用isPointer 'boolean‘来决定您应该将联合视为整数还是指针。
编辑:
如果执行速度是最重要的,那么typedef解决方案就是最佳选择。基本上,你必须为你想要运行的每个平台定义你想要的整数。您可以使用条件编译来做到这一点。我还会添加一个运行时检查,以确保您已经为每个平台正确编译(我在源代码中定义它,但您可以将其作为编译器标志传递,如"cc -DPTRINT_INT"):
#include <stdio.h>
#define PTRINT_SHORT
#ifdef PTRINT_SHORT
typedef short ptrint;
#endif
#ifdef PTRINT_INT
typedef int ptrint;
#endif
#ifdef PTRINT_LONG
typedef long ptrint;
#endif
#ifdef PTRINT_LONGLONG
typedef long long ptrint;
#endif
int main(void) {
if (sizeof(ptrint) != sizeof(void*)) {
printf ("ERROR: ptrint doesn't match void* for this platform.\n");
printf (" sizeof(void* ) = %d\n", sizeof(void*));
printf (" sizeof(ptrint ) = %d\n", sizeof(ptrint));
printf (" =================\n");
printf (" sizeof(void* ) = %d\n", sizeof(void*));
printf (" sizeof(short ) = %d\n", sizeof(short));
printf (" sizeof(int ) = %d\n", sizeof(int));
printf (" sizeof(long ) = %d\n", sizeof(long));
printf (" sizeof(long long) = %d\n", sizeof(long long));
return 1;
}
/* rest of your code here */
return 0;
}在我的系统(Ubuntu 8.04,32位)上,我得到:
ERROR: ptrint typedef doesn't match void* for this platform.
sizeof(void* ) = 4
sizeof(ptrint ) = 2
=================
sizeof(short ) = 2
sizeof(int ) = 4
sizeof(long ) = 4
sizeof(long long) = 8在这种情况下,我知道我需要使用PTRINT_INT (或long)进行编译。也许有一种方法可以在编译时用#if捕捉到这一点,但我现在不愿意费心去研究它。如果你遇到的平台没有足够的整数类型来保存指针,那你就不走运了。
请记住,使用特殊的指针值(1,2,3)来表示整数可能并不是在所有平台上都有效-这实际上可能是指针的有效内存地址。
不过,如果你要无视我的建议,我也没什么办法阻止你。这毕竟是你的代码:-)。一种可能是检查malloc的所有返回值,如果返回值为1、2或3,则再次使用malloc (即,使用mymalloc()自动执行此操作)。这将是一个小的内存泄漏,但它将保证您的特殊指针和真正的指针之间不会发生冲突。
发布于 2009-02-02 11:00:48
C99标准定义了标准的int类型:
7.18.1.4能够保存对象指针的整数类型以下类型指定了带符号的整数类型,其属性是任何指向void的有效指针都可以转换为此类型,然后再转换回指向void的指针,结果将与原始指针相等:
intptr_t
下面的类型指定一个无符号整数类型,该类型具有这样的属性:任何指向void的有效指针都可以转换为该类型,然后再转换回void的指针,结果将与原始指针相等:
uintptr_t
这些类型是可选的。
C99还定义了size_t和ptrdiff_t:
类型包括
ptrdiff_t
它是两个指针减去的结果的带符号整数类型;
size_t
它是sizeof运算符结果的无符号整数类型;以及
我见过的体系结构的最大对象大小等于整个内存,所以sizeof(size_t) == sizeof(==* ),但我不知道有什么东西既可以移植到C89 ( size_t就是),又可以保证足够大( uintptr_t就是)。
https://stackoverflow.com/questions/502811
复制相似问题