【问题标题】:What if I print non-existing element of an array with a static variable?如果我使用静态变量打印数组的不存在元素怎么办?
【发布时间】:2022-06-29 23:29:11
【问题描述】:

我是一名计算机科学专业的学生,​​我觉得我错过了一些非常简单的东西。你能帮帮我吗?

#include <stdio.h>

void do_stuff(int *c) {

    static int a = 0;

    int b = 0;
    a+=3;
    printf("%d %d\n", *(c+a), c[b]);
    printf("%d %d\n", *(c+6), c[b]);
    printf("%d %d\n", c[6], c[b]);

}

int main (void){

    static int array[6] = {5,17,23,42,127,3};
    do_stuff(array);
    do_stuff(array);
    do_stuff(array);
    return 0;
}

这是这段代码的结果:

42 5

3 5

3 5

6 5

6 5

6 5

0 5

9 5

9 5

我不明白,为什么第二个 do_stuff(array) 是 6 5。 我认为第二个和第三个 do_stuff(array) 的每个打印都是 0 5。然后我想也许这与静态a有关,我在没有变量的情况下尝试了它,所以只使用数字6。但答案是一样的。 您能否用粗体字解释输出的原因? 感谢您的帮助。

【问题讨论】:

  • 为什么你认为 c[6] 会是 0?
  • 您缺少的是 C 不对数组访问进行边界检查。您有责任确保代码永远不会访问数组边界之外的内存。
  • 第一次调用do_stuff(array) 也是访问越界数组内容,而不仅仅是第二次和第三次调用。
  • 就像@IanAbbott 所说的第一次调用将有一个全局缓冲区溢出,因为您尝试访问数组 c 的索引 6。
  • 这能回答你的问题吗? stackoverflow.com/questions/26426910/…

标签: arrays c static output printf


【解决方案1】:

在有6个元素的数组中,使用索引6会读取数组后面的第一个位置,不为0。读取的值取决于底层架构和编译器实现;取决于此类内存位置是否映射到您的进程,操作系统可能会终止您的应用程序。

在你的例子中,看起来在内存中你有变量a 的值存储在do_stuff() 的输入数组之后,这就是为什么打印c[6] 基本上会打印a 的值。

当然这最好描述为未定义的行为,而且源代码基本上是不正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多