C 如何访问位于机器';s位置0?

C 如何访问位于机器';s位置0?,c,C,如何访问位于机器位置0的中断向量?如果我将指针设置为0,编译器可能会将其转换为某个非零的内部空指针值。由于位置0处的任何内容都明显依赖于机器,因此您可以自由使用任何依赖于机器的技巧来达到此目的。阅读供应商的文档。很可能,如果访问位置0对您有任何意义,那么系统的设置将使访问变得相当容易。有些可能性是: 只需将指针设置为0。(这是一种不必工作的方式,但如果它有意义,它可能会工作。) 将整数0指定给int变量,并将该int转换为指针。(这也不能保证有效,但很可能有效。) 使用并集将指针变量的位设置为0

如何访问位于机器位置0的中断向量?如果我将指针设置为0,编译器可能会将其转换为某个非零的内部空指针值。

由于位置0处的任何内容都明显依赖于机器,因此您可以自由使用任何依赖于机器的技巧来达到此目的。阅读供应商的文档。很可能,如果访问位置0对您有任何意义,那么系统的设置将使访问变得相当容易。有些可能性是:

只需将指针设置为0。(这是一种不必工作的方式,但如果它有意义,它可能会工作。) 将整数0指定给int变量,并将该int转换为指针。(这也不能保证有效,但很可能有效。) 使用并集将指针变量的位设置为0:

union {
    int u_p;
    int u_i;    / assumes sizeof(int) >= sizeof(int *) */
} p;

p.u_i = 0;
memset((void *)&p, 0, sizeof(p));
使用memset将指针变量的位设置为0:

union {
    int u_p;
    int u_i;    / assumes sizeof(int) >= sizeof(int *) */
} p;

p.u_i = 0;
memset((void *)&p, 0, sizeof(p));
声明外部变量或数组

extern int location0;

并使用汇编语言文件或某些特殊的链接器调用来安排此符号引用(即变量放置在)地址0。

根据您的C实现,内部空指针可能不是0,这是正确的。但通常是这样。如果希望非常安全,可以键入值,或使用
memset()

或:


如果你在一个需要读/写地址为零的向量的领域工作(我猜你是在某种嵌入式系统上?),那么你会发现你所做的很多事情都超出了“C”标准的一般直接中间解释

您可以非常安全地假设嵌入式编译器将生成对放入指针的地址的访问,而不会神奇地更改其内容


但是,您不能总是假设数据表中的物理地址零是处理器在读/写地址零时访问的地址。如果处理器中有MMU,那么您可能需要经历某种逻辑->物理映射过程,即使没有完整的MMU,许多现代小型嵌入式处理器也会利用中断向量周围的地址空间玩游戏(例如,从闪存启动,然后选择性地将该部分地址空间重新映射到RAM。)

您应该使用
无符号
而不是
int
。此外,您还假设如果读取地址零,用户程序不会产生内存故障。这是问题的假设。在大多数(嵌入式)中我使用过的机器类型,内存地址0是完全有效的,与空指针地址不同。但C标准要求将数字0转换为内部空指针地址,这使大多数代码保持可移植性。@Nathon,我有相反的经验-0几乎总是有效指针和空点er地址。这怎么可能?当访问内存地址时,机器会触发中断,或者不会。C保证它会将地址0(在编译时)转换为空指针地址的机器表示形式。