Stack cookie instrumentation code detected a stack-based buffer overrun.

本文探讨了在VC++中遇到的栈检测指令导致的栈基缓冲区溢出问题,原因通常源自内存操作越界。解决策略涉及检查并修复函数内可能的栈操作,如数组边界。

在vc++下面出现这个调试错误:Stack cookie instrumentation code detected a stack-based buffer overrun.(栈检测指令检测到基于栈的缓存区被某种操作越界操作了。)

原因:在栈上执行了某种操作,例如,内存复制(memcpy),内存设置(memset),缓冲区格式化(sprintf),等等,查是这个操作已经越过了申请的栈空间的大小。系统在退出函数调用时,会清理栈空音,也就是说,越过函数的结束花括号(})时,就是报以上错误。

要解决以上问题,要在这个函数体内认真看看针对栈的操作,例如对针局部数组的操作是否越界。

#include <stdio.h> #include <stdbool.h> #include <math.h> #include <string.h> //单次加法运算 static double Add(double a, double b) { double result; result = a + b; return result; } //整数转换字符 static int AscTurnChar(int asc) { char result; result = asc; return result; } //字符转换整数 static char CharTurnAsc(char cha) { int result; result = cha; return cha; } //字符串大小写 static void StrTurn(char str[]) { int i = 0; while (str[i] != '\0') { if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] + 32; } else if (str[i] >= 'a' && str[i] <= 'z') { str[i] = str[i] - 32; } i++; } } int main() { //单次加法运算 //double x, y; //scanf_s("%lf%lf", &x, &y); //double add = Add(x, y); //printf("%lf", add); //return 0; //整数转换字符 //int asc; //scanf_s("%d", &asc); //char asc_turn_cha = AscTurnChar(asc); //printf("%c", asc_turn_cha); //return 0; //字符转换整数 //char cha; //scanf_s("%c", &cha, 1); //int char_turn_asc = cha; //printf("%d", cha); //return 0; //字符串大小写? //char c;/*int c?*/ //while((c = getchar()) != EOF) //{ // if (c >= 'a' && c <= 'z') // { // printf("%c", c - 32); // } // else printf("%c", c); //字符串大小写(无空格) //char input[100]; //scanf_s("%s", &input, 100); //StrTurn(input); //printf("%s", input); //return 0; //字符串大小写(有空格/无换行) //char input[101]; //fgets(input, sizeof(input), stdin); //StrTurn(input); //printf("%s", input); //return 0; //字符串大小写(某条件) //char ch; //scanf_s("%c", &ch, 1); //while (ch != '#') //{ // printf("%c", ch - 32); // scanf_s("%c", &ch, 1); //} //return 0; //输出字符对应(自动的) //int i = 1; //while (i <= 128) //{ // printf("%d:%c\n", i, i); // i++; //} //return 0; //输出字符对应(被动的) //char x; //while (scanf_s("%c", &x, 1) != EOF) //{ // if (x != '\n') // { // printf("%c:%d\n", x, x); // } // else // printf("结束"); //} //return 0; //强制类型转换(仅附注) //int a,b; //float c=(float)a/b; //float d=a*0.1/b; //错误输入抵抗? //int a, b; //while (scanf_s("%d%d", &a, &b) != EOF) //{ // printf("%d\n", a + b); // while (getchar() != '\n'); //} //数组定义调用 //实现1:定义设定长度并输出赋值后的数组 //int num, Num; //int arr[100]; //int i = 0, j = 0; //scanf_s("%d", &num); //for (i = 0; i < num; i++) //{ // scanf_s("%d", &Num); // arr[i] = Num; //} //for (j = 0; j < num; j++) //{ // printf("%d ", arr[j]); //} //实现2:定义未定长度并输出赋值后的数组 //int Num; //int arr[100]; //int i = 0, j = 0; //for (i = 0; i < 100; i++) //{ // scanf_s("%d", &Num); // if (Num == -1) // { // break; // } // arr[i] = Num; //} //for (j = 0; j < i; j++) //{ // printf("%d ", arr[j]); //} //数位拆解输出 //实现1:数位逆向输出:@123 #3 2 1 //int num, digit1, digit2; //scanf_s("%d", &num); //@123 //while (1) //{ // digit1 = num % 10;//@123 #3 @12 #2 // digit2 = num / 10;//@123 #12 @12 #1 // printf("%d ", digit1); // num = digit2; // if (num < 10) // { // if (num == 0); // { // printf("%d ", digit2); // break; // } // printf("%d ", num); // break; // } //} //实现2:数位正向输出:@123 #1 2 3 //int num, digit1, digit2; //int arr[1000]; //int i = 0, j = 0; //scanf_s("%d", &num); //if (num < 10) //{ // printf("%d ", num); //} //if (num >= 10) //{ // for (i = 0; i < 100; i++) // { // digit1 = num % 10; //@123 #3 @12 #2 // digit2 = num / 10; //@123 #12 @12 #1 // arr[i] = digit1; //arr[0]=3 arr[1]=2 // num = digit2; //num=12 num=1 // if (num < 10) // { // arr[i + 1] = num;//arr[2]=1 // break; //i=1 // } // } // for (j = 0; j < i + 2; j++) // { // printf("%d ", arr[i + 1 - j]); // } //#arr[2] #arr[1] #arr[0] //} //各个规制输出 //int num=123; //float flo = 123.456; //printf("%5d\n", num); //printf("%-5d\n", num); //printf("%05d\n", num); //printf("%.5f\n", flo); //printf("%10.f\n", flo); //printf("%10.5f\n", flo); //两种进制转换 double D10; scanf_s("%llf", &D10); double d10 = log2(D10); double d10ceil = ceil(d10); for (int i = 0; i < d10ceil; i++) { printf("%d ", i); } return 0; }断点报错
最新发布
09-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值