|
|
1
10
可能在大多数现代的普通机器中。 但是,我敢打赌有一些模糊的编译器或配置(例如,一个使用32位整数算术的16位寻址机器),情况并非如此。 一 uintptr_t 不过,这两种类型都可以保证,因此如果您愿意,可以使用该类型。 |
|
|
2
3
下面是一个例子,将一个指针转换为一个整数时,可能不会产生相同的指针。 给出一种具有24位地址并使用两个16位数量描述位置的体系结构。让一个量是段,另一个量是偏移量。位置由符号段:偏移指定。 实际24位(物理)地址的计算方法如下:
使用这个符号,可以有多个段:描述相同物理地址的偏移对。 当转换为整数时,使用32位(无符号)数量(以简化处理器中的内部计算)。问题是如何将物理地址转换为创建物理地址时使用的同一段::偏移量。 将整数转换为指针的一般公式是:
虽然这个新段和偏移量的物理地址等于原始段的物理地址:偏移量,但不能保证段和偏移量相同。 为了优化代码,在一个段中有使用相对寻址的处理器指令。当段值由于从物理地址转换而改变时,这些指令可能会变得混乱。 在这种情况下,可以将指针转换为整数。但是,强烈建议不要将整数转换为指针。在运行时可能会发生难以调试的错误。 附加问题:你能说出实际的架构吗? |
|
|
3
2
你为什么要这么做?
对C的答复,我对C++的了解不多:不,没有定义行为来抛出一个
那么,如果你的
编辑: 这是C99标准的相关部分。正如你看到的,所有的警报都会响…
最后一个特别令人尴尬,因为这意味着这样获得的指针值在被覆盖之前不能再使用:
|
|
|
4
1
不。在大小方面,空指针与任何其他指针都没有区别。因此,它将遇到与其他指针类型完全相同的问题类型。 |
|
|
5
1
它的实现定义与上一个问题的定义相同,原因也相同。它不太可能导致错误行为,但它仍然是实现定义的。 |
|
|
6
1
不需要。在某些情况下,它似乎适用于特定的编译器设置,两年后,您将花费数周时间调试某些更改,而转换将不再按预期工作。
如果您只是以一种不需要这种行为的方式设计您的代码(最佳情况完全避免使用这种转换,最坏情况下使用
|
|
|
7
0
不一定。取决于指针的大小。你为什么要这么做? |
|
|
8
0
如果整数的范围相当小,则可以执行如下操作:
然后使用
|
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |
|
|
tTt · 使用堆栈中的值重新分配指针 1 年前 |
|
|
manuel · 现代C中空指针的替代方案++ 1 年前 |