当我尝试在 Visual Studio 2019 中调试下面列出的代码时,我在 main 函数的系统暂停行之前收到堆栈 cookie 缓冲区溢出错误。我不知道如何解决它。我是编程新手,不知道该怎么做。有人可以帮我理解吗?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/************************************************************************************/
int Greater(int na, int nb);
void DisplayArray(int arr[], int asize);
/************************************************************************************/
/************************************************************************************/
int main(void)
{
int myArray[10] = { 43, 24, 76, 11, 37, 34, 55, 49, 5 }; /* initialize an array */
int asize = 10; /* set the size of the above array */
int na, nb;
int result;
printf("Enter 2 integers\n");
scanf("%d %d", &na, &nb);/* the variables were missing the & in the scanf function call*/
result = Greater(na, nb);
fprintf(stdout, "na = %d nb = %d greater = %d\n", na, nb, result);
ModifyArray(myArray, asize);
fprintf(stdout, "Array after modification\n");
DisplayArray(myArray, asize);
system("pause");
return 0;
}
/***************************************************************************************
This function returns the larger of its two arguments
***************************************************************************************/
int Greater(int na, int nb) {
if (na >= nb)
return na;
else
return nb;
}
/***************************************************************************************
This function modifies the elements of an array
***************************************************************************************/
int ModifyArray(int arr[], int asize) {
int i;
/* Add 5 to each element of array */
for (i = 0; i <= asize; i++); {
arr[i] += 5;
}
}
/***************************************************************************************
Display function
/***************************************************************************************/
void DisplayArray(int arr[], int asize) {
int i;
for (i = 0; i < asize; i++) {
fprintf(stdout, "i = %d arr[i] = %d\n", i, arr[i]);
}
答案 0 :(得分:0)
基于堆栈的 cookie 的问题通常意味着您试图在存储在堆栈中的缓冲区之外写入(通常,局部变量存储在堆栈中)并覆盖了 Visual Studio 插入的值检测这些类型的错误(因为堆栈中的缓冲区覆盖会导致应用程序中的可利用漏洞)。如果您的代码行为正确,则 cookie 不会被修改,您也不会遇到此错误。
正如 Ron 所评论的,问题出现是因为您正在访问 ModifyArray 中的 arr[10]。不是因为阅读它,而是因为您正在更新值。请记住,由于数组是基于 0 的,因此大小为 10 的数组在索引 10 处没有元素,因此 ModifyArray 中的循环走得太远并最终修改了 cookie。事实上,请注意您在 DisplayArray 中有一个不同的循环条件(这是正确的)。