我正在处理一些遗留代码,它广泛使用这种形式:
// Allocate a look-up-table of pointers.
long *pointerLUT = (long *) malloc(sizeof(long) * numPointers);
...
// Populate the array with pointers.
for (int i=0; i<numPointers; i++) {
pointerLUT[i] = (long) NewFoo();
}
...
// Access the LUT.
Foo *foo = (Foo *) pointerLUT[anIndex];
您可以看到,这段代码分配了一个包含longs的数组,其想法是用它们作为通用指针存储。
Q1. 这种方法安全吗?
Q2. 从样式上来说,如何改进它?是否需要改进?(类型转换使我感到不安)
谢谢。
size_t
替代long
... - smerlinuintptr_t
可能是更好的选择。如果C实现支持将指针类型转换为整数并且不会丢失信息,那么它可能会提供uintptr_t
。uintptr_t
和size_t
之间的区别在于,如果提供了uintptr_t
,则保证它可以容纳任何有效的void指针,并且保证当转换回void指针时,它应该与原始指针相等。 - dreamlax