两个指针表示的困境

时间:2019-04-06 16:06:40

标签: c pointers memory-management

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

  

如果目标计算机具有两种不同的指针表示形式,则   编译器将不知道该参数使用哪种表示形式。

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

2 个答案:

答案 0 :(得分: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也会期望{如果没有强制转换,将{1}}作为变量参数是错误的,因为实现可以定义

char *

#define NULL 0 不是NULL指针,它是将整数(sem_t*)-1转换为具有实现定义的结果的指针。在POSIX系统上,(必然)将导致其地址永远不能为任何-1的位置。

在这里使用sem_t实际上是一个非常糟糕的约定,因为结果地址很可能没有-1正确对齐,因此整个结构都本身没有定义的行为。

答案 1 :(得分:1)

我相信这暗示着某些16位体系结构上的“近”和“远”指针吗?据我了解,他们使用了不同的偏移量缩放来解决仅占用64kb地址空间的问题。