3 回答
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在“中”模型中生成代码
TA贡献1811条经验 获得超4个赞
在实模式x86上,按段+偏移量访问代码和数据,每段16位。“近”指针仅为16位,并使用当前段,“远”指针为32位,并指定段和偏移量。对于C编译器,您可以选择几种不同的内存模型,其中代码和数据的近或远指针具有不同的默认值。
例如,默认情况下,“中”内存模型使用近指针存储数据,而远指针存储代码。
如果某些现代嵌入式处理器具有类似的内存模型,我不会感到惊讶。
TA贡献1858条经验 获得超8个赞
请注意,POSIX要求指向对象的指针和指向函数的指针具有相同的大小:
2.12.3指针类型
所有功能指针类型均应与void的类型指针具有相同的表示形式。将函数指针转换为void *不会改变表示形式。可以使用显式强制转换将此类转换产生的void *值转换回原始函数指针类型,而不会丢失信息。
注意:ISO C标准不需要这样做,但是为了符合POSIX要求,它是必需的。
因此,要求POSIX兼容性的系统将是统一的。如果您仅针对此类机器,则不必担心差异。
- 3 回答
- 0 关注
- 524 浏览
添加回答
举报