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
.
开始
有人可以解释一下,为什么在这个程序中如果我以这种方式调用 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
.