为什么当我访问越界数组时,不对整数使用 C 的 static 关键字会导致 shell 中止?

问题描述 投票:0回答:1

我试图将一个值分配给 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 pointers memory malloc
1个回答
0
投票

当然,你要问的是解释 C 中的未定义行为。正如它所暗示的,会发生什么取决于构建你的代码的编译器和你正在使用的计算机。

但是大多数架构都有自己的堆栈(分配局部变量的地方)自上而下,而不是自下而上。这意味着局部变量

b
的内存地址低于局部变量
a

static 关键字使变量存储到程序的全局/静态存储中,显然它们是在 b 之前存储 a 的,因此静态变量

b
的内存地址比静态变量 `a 更高 '

总的来说,您不应该从未定义的行为中做出任何假设。它可以做任何事情,并且您会收到惊喜。

© www.soinside.com 2019 - 2024. All rights reserved.