C 中的简单堆栈损坏

Simple stack corruption in C

有人可以解释一下,为什么在这个程序中如果我以这种方式调用 printf 标志将会获胜?但没有会不会?为什么这个 printf 允许这样的事情我不明白谢谢。为什么没有 printf 数组不能覆盖变量标志?

#include <stdio.h>
#include <stdbool.h>

int main() {

    int flag = false;

    int arr[10] = {0};
    int siz = sizeof(arr) / sizeof(* arr);

    printf("%p", &flag);
    arr[10] = 1; // Without the printf call can't get the win. Why?
    puts("");

    if(flag == true)
    {
        printf("win !");
    }
    else
    {
        printf("lose");
    }



    return 0;
}

您的程序越界访问数组。数组索引从 0 开始,到 N - 1 结束,其中 N 是数组的大小.

这样做会调用未定义的行为,因此在此之后您对程序行为的预测将是错误的。添加 printf() 可以改变这种行为并且确实如此,这就是 undefined behavior 的意思,它不应该影响程序的行为但是一旦你导致了未定义的行为在

arr[10] = 1;

您无法知道该程序将如何运行。

这是您的问题所在

arr[10] = 1;

您只在数组中分配了 10 个元素

int arr[10] = { 0 };

arr[10] 实际上试图访问数组中的第 11 个元素,因为数组索引从 0.

开始