我试图将一个值分配给 C 演示程序中数组外部的位置。该数组的类型为
int
,我希望它溢出到我声明的下一个变量 b
。然而,运行该程序后,我的 shell 返回 1 并中止。当我将 static
关键字添加到数组和整数时,程序允许我打印变量 b
的值。但是,我不确定为什么。 static 关键字在这种情况下有什么作用,有什么区别?
拿这段代码:
#include <stdio.h>
int main(void)
{
int a[4];
int b;
a[4] = 42;
printf("%i\n", b);
}
当我运行它时,程序输出
1\n zsh:abort ./memory
并退出。
但是,当我将其修改为以下内容时:
#include <stdio.h>
int main(void)
{
static int a[4];
static int b;
a[4] = 42;
printf("%i\n", b);
}
程序现在输出
42
。我听说 static 关键字在 C 中可以有多种用途,但是它在这里做什么改变了程序的行为呢?我看了很多定义还是不明白:(
当然,你要问的是解释 C 中的未定义行为。正如它所暗示的,会发生什么取决于构建你的代码的编译器和你正在使用的计算机。
但是大多数架构都有自己的堆栈(分配局部变量的地方)自上而下,而不是自下而上。这意味着局部变量
b
的内存地址低于局部变量a
。
static 关键字使变量存储到程序的全局/静态存储中,显然它们是在 b 之前存储 a 的,因此静态变量
b
的内存地址比静态变量 `a 更高 '
总的来说,您不应该从未定义的行为中做出任何假设。它可以做任何事情,并且您会收到惊喜。