考虑这段代码:
#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/