![]() |
1
16
|
![]() |
2
15
简单地说,不是。不是所有的架构都能保证。
我的问题是:为什么?如果要分配一个足够大的类型来存储
编辑:根据您对重复问题的注释,您希望存储指针(1,2,3)的特殊值以指示额外信息。 . 不能保证1、2和3不是完全有效的指针。在需要在4字节边界上对齐指针的系统中可能会出现这种情况,但是,既然您询问了所有体系结构,我就假设您具有很高的可移植性。 找到另一种正确的方法。例如,使用union(来自内存的语法,可能是错误的):
然后,可以使用isPointer“boolean”来决定是将并集视为整数还是指针。 编辑:
如果执行速度是最重要的,那么typedef解决方案就是最佳选择。基本上,您必须为要在其上运行的每个平台定义所需的整数。您可以通过条件编译来实现这一点。我还将添加一个运行时检查,以确保您已为每个平台正确编译,因此(我在源代码中定义了它,但您会将其作为编译器标志传递,如“
在我的系统(Ubuntu 8.04,32位)上,我得到:
在这种情况下,我知道我需要用PTRINT\ u INT(或long)编译。也许有一种方法可以在编译时用#if捕捉到这一点,但我现在不想费心研究它。如果你碰到一个没有足够整数类型来容纳指针的平台,你就走运了。 请记住,使用特殊指针值(1,2,3)来表示整数也可能不适用于所有平台-这实际上可能是指针的有效内存地址。
|
![]() |
3
13
C99还定义了尺寸和公差:
我见过的体系结构中,对象的最大大小等于整个内存,所以sizeof(size\u t)==sizeof(void*),但我不知道有什么东西既可以移植到C89(这是
|
![]() |
4
4
这在标准32位系统上是正确的,但是肯定没有保证,而且您可以找到许多不正确的架构。例如,一个常见的误解是x86\u64上的sizeof(int)应该是8(因为我猜它是一个64位系统),而事实并非如此。在x86_64上,sizeof(int)仍然是4,但是sizeof(void*)是8。 |
![]() |
5
2
在构建过程中包含此代码很简单(使用
|
![]() |
6
1
|
![]() |
7
0
|
![]() |
8
0
int数据类型将是大多数体系结构的答案。 不 对此的保证 |
![]() |
9
0
答案似乎是“不”,但如果您所需要的只是一个可以同时充当两者的类型,那么您可以使用union:
|
![]() |
10
0
所以不能保证。 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 5 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 5 月前 |
![]() |
tTt · 使用堆栈中的值重新分配指针 6 月前 |
![]() |
manuel · 现代C中空指针的替代方案++ 7 月前 |
![]() |
CPlus · 有没有一种方法可以确定指针的表示在C中是否是“线性的”? 11 月前 |