指针大小可以在数据指针和函数指针之间变化吗?

我只是在阅读C FAQ中有关指针的部分。


它讨论了不能使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,并且void *仅保证足够大以容纳指向数据的指针。


谁能举一个平台的例子,其中指向数据的指针和指向函数的指针实际上具有不同的大小?


撒科打诨
浏览 499回答 3
3回答

慕田峪7331174

> type ppp.c#include <stdio.h>#include <stdlib.h>int global = 0;int main(void) {&nbsp; &nbsp; int local = 0;&nbsp; &nbsp; static int staticint = 0;&nbsp; &nbsp; int *mall;&nbsp; &nbsp; int (*fx)(void);&nbsp; &nbsp; fx = main;&nbsp; &nbsp; mall = malloc(42); /* assume it worked */&nbsp; &nbsp; printf("#sizeof pointer to local: %d\n", (int)sizeof &local);&nbsp; &nbsp; printf("#sizeof pointer to static: %d\n", (int)sizeof &staticint);&nbsp; &nbsp; printf("#sizeof pointer to malloc'd: %d\n", (int)sizeof mall);&nbsp; &nbsp; printf("#sizeof pointer to global: %d\n", (int)sizeof &global);&nbsp; &nbsp; printf("#sizeof pointer to main(): %d\n", (int)sizeof fx);&nbsp; &nbsp; free(mall);&nbsp; &nbsp; return 0;}> tcc -mc ppp.cTurbo C&nbsp; Version 2.01 ...warnings about unused variables elided ...Turbo Link&nbsp; Version 2.0 ...> ppp#sizeof pointer to local: 4#sizeof pointer to static: 4#sizeof pointer to malloc'd: 4#sizeof pointer to global: 4#sizeof pointer to main(): 2> tcc -mm ppp.c> ppp#sizeof pointer to local: 2#sizeof pointer to static: 2#sizeof pointer to malloc'd: 2#sizeof pointer to global: 2#sizeof pointer to main(): 4tcc -mc在“紧凑”模型中生成代码;tcc -mm在“中”模型中生成代码

波斯汪

在实模式x86上,按段+偏移量访问代码和数据,每段16位。“近”指针仅为16位,并使用当前段,“远”指针为32位,并指定段和偏移量。对于C编译器,您可以选择几种不同的内存模型,其中代码和数据的近或远指针具有不同的默认值。例如,默认情况下,“中”内存模型使用近指针存储数据,而远指针存储代码。如果某些现代嵌入式处理器具有类似的内存模型,我不会感到惊讶。

猛跑小猪

请注意,POSIX要求指向对象的指针和指向函数的指针具有相同的大小:2.12.3指针类型所有功能指针类型均应与void的类型指针具有相同的表示形式。将函数指针转换为void *不会改变表示形式。可以使用显式强制转换将此类转换产生的void *值转换回原始函数指针类型,而不会丢失信息。注意:ISO C标准不需要这样做,但是为了符合POSIX要求,它是必需的。因此,要求POSIX兼容性的系统将是统一的。如果您仅针对此类机器,则不必担心差异。
打开App,查看更多内容
随时随地看视频慕课网APP