【发布时间】:2020-01-11 13:17:15
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int ar[3][4] = {{1,2,3,4},{5,6,7,8},{8,10,11,12}};
printf("sizeof(ar)=%lu;sizeof(*ar)=%lu;sizeof(*ar + 0)=%lu;sizeof(*(*ar + 0))=%lu;valueof(*(*ar + 0)) = %d\n",
sizeof(ar), sizeof(*ar), sizeof(*ar + 0), sizeof(*(*ar + 0)), *(*ar + 0));
printf("\n\nsizeof(&ar)=%lu;sizeof(&(*ar))=%lu\n", sizeof(&ar), sizeof(&(*ar)));
printf("\nsizeof(int)=%lu\n",sizeof(int));
return 0;
}
输出:
sizeof(ar)=48;
sizeof(*ar)=16;
sizeof(*ar + 0)=8;
sizeof(*(*ar + 0))=4;
valueof(*(*ar + 0)) = 1
sizeof(&ar)=8;
sizeof(&(*ar))=8
sizeof(int)=4
我可以假设(据此),所有地址都是 8 个字节长。但这仅适用于近指针(或偏移指针)。但是,如果我要使用的指针位于内存的另一个段中怎么办?在这种情况下,根据英特尔文档,远指针是 8 个字节的偏移量和 2 个字节的段数。也就是说,远指针大小应该是10 字节。但是没有 c 程序曾经打印过我。那么如何确定远指针和近指针呢?
【问题讨论】:
-
sizeof运算符返回的值的类型是size_t,必须使用%zu格式打印(格式说明符和参数类型不匹配会导致未定义的行为)。 -
怎么没有远指针?我已经阅读了我当前的奔腾处理器的英特尔文档,所以显然有很远的指针,不理解这种说法。
-
在现代系统中确实没有“远”或“近”指针之类的东西。它们是 DOS 等旧“实模式”系统的产物。在现代系统中,只有指针。
-
大多数现代操作系统使用flat memory model 而不是segmented memory model。
-
请使用有关您正在使用的编译器、您正在使用的 CPU 以及您正在使用的操作系统的信息更新您的问题。用于分段内存(例如较旧的 Intel 80xx 处理器)的 Far 和 Near 指针需要 C 编译器中的支持,以便能够将指针指定为包含段和偏移量的 Far 指针或仅包含段内的偏移量。