c - 为什么ptr3的大小是2?

标签 c pointers

//观察到此代码的输出为 4 4 2 ?我不明白为什么 ptr3 是 2?请帮忙

#include<stdio.h>

int main()
{
char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;
printf("%d, %d, %d\n", sizeof(ptr1), sizeof(ptr2), sizeof(ptr3)); 
return 0;
}

最佳答案

nearfarhuge 指针是非标准的。

在支持它们的实现中(通常用于非常老的 x86 系统),内存中的特定位置可以由段和偏移量指定。 near 指针仅包含一个偏移量,隐式保留该段。因此它比 far 指针需要更少的空间。

现代编译器不使用任何这些关键字。我建议你自己找一个更新的编译器;有很多免费的。

参见 this question获取更多信息。

顺便说一句,printf 的"%d" 格式需要一个int 类型的参数; sizeof 产生类型为 size_t 的结果,这是一种不同的类型。您可以将 printf 调用更改为:

printf("%d, %d, %d\n", (int)sizeof ptr1, (int)sizeof ptr2, (int)sizeof ptr3);

(现代的做法是:

printf("%zu, %zu, %zu\n", sizeof ptr1, sizeof ptr2, sizeof ptr3);

但是支持 nearfar 指针的实现不太可能现代到足以支持 "%zu",这是在 C99 中引入。)

关于c - 为什么ptr3的大小是2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947272/

相关文章:

c - 第三阶段二元炸弹组装

c++ - const 双指针参数的非常量指针参数

c++ - 如何生成 C++ 动态对象名称?

c - 使用指针遍历内存

c - 如何为 SIGCHLD 制作一个信号处理程序,它将在 shell 中获取后台进程?

c++ - string::find() c++ 使用的字符串搜索算法

c - C中的break语句

c - C中 volatile 非静态局部变量的原因

c - const char * const 和 const char [] 有区别吗?

c - 结构体指针前向声明?