【发布时间】: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