gpt4 book ai didi

c - 指向静态字符的 int 指针

转载 作者:行者123 更新时间:2023-12-01 01:48:19 25 4
gpt4 key购买 nike

考虑这段代码:

#include <stdio.h>

#define main_arg int argc, char *argv[]

int main(main_arg)
{
static char chr = '5' - '0'; // Dec 5
int *p = &chr; // 4 bytes pointer

printf("Result: %i", *p);

return(0);
}

Result: 5

为什么我必须将 chr 声明为静态才能具有适当的值?如果我不使用静态,p 将读取总共 4 个字节,其中接下来的 3 个字节将是“随机的”。但是,如果 chr 表示的那个字节位于静态内存中,那不会发生吗?

这是未定义的行为吗?结果是不确定的,它只是偶然发生的(我一直在尝试)?

最佳答案

在某些系统中,您的代码可能无法运行,主要是因为对齐。在某些 RISC 系统中,char 可以对齐到任何内容,但是 int 必须对齐到 4 个字节,例如。在这种情况下,如果您尝试像这样取消引用指针,某些内存访问保护机制可能会发出中断,整个程序将立即失败。

在你的情况下,假设你在 Linux 中运行,使用 intel cpu,用 gcc 编译,chr 将驻留在 .data 段,以及它的所有不相关部分最有可能设置为 0。

但同样,您正在以错误的方式访问内存,一切都应该发生,因为这是未定义的行为。

为了提供更多信息,如果您删除static,并在上述环境中运行该程序,您读取的额外值不是“随机的”,而是字面意义上的随机。这称为 canary。它是一种检测堆栈集中攻击的内存保护机制。

关于c - 指向静态字符的 int 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com