两个指针表示困境

问题描述 投票:2回答:2

我不明白机器如何有多个指针表示。来自GNU的The following

如果目标机器有两个不同的指针表示,编译器将不知道该参数使用哪个表示。

这怎么可能?这句话和#define SEM_FAILED ((sem_t*)-1)之间有什么关系?后者做了什么?我知道它是空指针,具有恒定值。但它如何在内存中表示,因为它指向-1?如果它指向正确的位置怎么样?

c pointers memory-management
2个回答
2
投票

C靶向的最早架构之一是具有36位或18位字词(int类型)的一些架构。只有这些单词可以使用本机指针在0,1,2等地址直接寻址。但是,一个字符的一个单词会浪费太多内存,因此添加了一个9位char类型,一个单词中包含2或4个字符。由于单词指针不能解决这些问题,因此char *由两个单词组成:一个指向该单词,另一个单词指示该单词中的哪个字节应该被操作。

当然现在的问题是char *是两个字宽,而int *只是一个,这在调用没有原型或省略号的函数时很重要 - 而(void*)0将具有与(char *)0兼容的表示,它与(int *)0不兼容因此需要明确的演员表。


NULL还有另一个问题。虽然GCC似乎确保NULL将是void *类型,但C标准并不能保证,所以即使在像NULL这样的函数调用中使用execl期望char *s作为变量参数也是错误的而没有强制转换,因为实现可以定义

#define NULL 0

(sem_t*)-1不是NULL指针,它是整数-1转换为具有实现定义结果的指针。在POSIX系统上,它(必要时)会产生一个永远不能成为任何sem_t位置的地址。

这里使用-1实际上是一个非常糟糕的惯例,因为生成的地址很可能没有sem_t的正确对齐,所以整个构造本身具有未定义的行为。


1
投票

我相信这暗指某些16位架构上的“近”和“远”指针?据我所知,他们使用不同的偏移标记来解决仅仅64kb的地址空间问题。

© www.soinside.com 2019 - 2024. All rights reserved.