为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
撒科打诨 2019-10-19 16:49:21
我只是在阅读C FAQ中有关指针的部分。它讨论了不能使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,并且void *仅保证足够大以容纳指向数据的指针。谁能举一个平台的例子,其中指向数据的指针和指向函数的指针实际上具有不同的大小?
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

> type ppp.c

#include <stdio.h>

#include <stdlib.h>


int global = 0;


int main(void) {

    int local = 0;

    static int staticint = 0;

    int *mall;

    int (*fx)(void);


    fx = main;

    mall = malloc(42); /* assume it worked */

    printf("#sizeof pointer to local: %d\n", (int)sizeof &local);

    printf("#sizeof pointer to static: %d\n", (int)sizeof &staticint);

    printf("#sizeof pointer to malloc'd: %d\n", (int)sizeof mall);

    printf("#sizeof pointer to global: %d\n", (int)sizeof &global);

    printf("#sizeof pointer to main(): %d\n", (int)sizeof fx);

    free(mall);

    return 0;

}

> tcc -mc ppp.c

Turbo C  Version 2.01 ...

warnings about unused variables elided ...

Turbo Link  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(): 4

tcc -mc在“紧凑”模型中生成代码;tcc -mm在“中”模型中生成代码


查看完整回答
反对 回复 2019-10-19
?
波斯汪

TA贡献1811条经验 获得超4个赞

在实模式x86上,按段+偏移量访问代码和数据,每段16位。“近”指针仅为16位,并使用当前段,“远”指针为32位,并指定段和偏移量。对于C编译器,您可以选择几种不同的内存模型,其中代码和数据的近或远指针具有不同的默认值。

例如,默认情况下,“中”内存模型使用近指针存储数据,而远指针存储代码。

如果某些现代嵌入式处理器具有类似的内存模型,我不会感到惊讶。


查看完整回答
反对 回复 2019-10-19
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

请注意,POSIX要求指向对象的指针和指向函数的指针具有相同的大小:


2.12.3指针类型


所有功能指针类型均应与void的类型指针具有相同的表示形式。将函数指针转换为void *不会改变表示形式。可以使用显式强制转换将此类转换产生的void *值转换回原始函数指针类型,而不会丢失信息。


注意:ISO C标准不需要这样做,但是为了符合POSIX要求,它是必需的。


因此,要求POSIX兼容性的系统将是统一的。如果您仅针对此类机器,则不必担心差异。


查看完整回答
反对 回复 2019-10-19
  • 3 回答
  • 0 关注
  • 496 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信