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

标签 c pointers memory-management static

考虑这段代码:

#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/

相关文章:

c - 我应该如何管理 C block 功能的内存? (苹果扩展)

c - 我如何忽略 C 中每行某个位置之后的字符?

c++ - 起始指针和内部指针之间的区别是什么以及何时使用它们

c++ - 返回指向 const 数据成员的 const 指针和 'auto' 关键字。有点迷茫

c++ - 取消引用指向其类内对象的指针

iphone - 如何以编程方式在 iPhone 中查找可用内存?

c - 在删除之前从共享内存中分离

c - 为什么将结构的大小放在结构中?

c++ - 在 C++ 中引用 Sub Array 2D

memory-management - 关于 "__GFP_COMP"的用法?