如何修复“调试错误!,变量'x'周围的堆栈已损坏”?
Posted
技术标签:
【中文标题】如何修复“调试错误!,变量\'x\'周围的堆栈已损坏”?【英文标题】:How to fix "Debug Error!, Stack around the variable 'x' was corrupted"?如何修复“调试错误!,变量'x'周围的堆栈已损坏”? 【发布时间】:2019-09-05 03:42:40 【问题描述】:我真的是 C 语言的新手,正在测试一个简单的 if 语句程序,根据您的年龄和性别,该程序可以从 4 种不同的结果中得出一个答案。
大概是这样的: 如果您未满 55 岁且为男性,则会打印: “你是一个处于最佳年龄的男人!”
但我遇到了一个错误代码,上面写着:运行时检查失败 #2 - 围绕变量“miesVaiNainen”的堆栈已损坏。
我自己,认为这可能与:if (manOrFemale == "f" && age <= 55)
如何解决此问题,以免出现错误?
我曾尝试在 *** 中寻求帮助,并尝试大量更改代码。
int age;
char manOrFemale;
printf("Are you a man or a female(m/f)");
scanf("%s", &manOrFemale);
printf("Input age:");
scanf("%d", &age);
if (manOrFemale == "f" && age <= 55)
printf("\nYou are a lady at her best!");
else if (manOrFemale == "f" && age >= 56)
printf("\nYou look young for your age!");
if (manOrFemale == "m" && age <= 55)
printf("\nYou are a man at his best age!");
else if (manOrFemale == "m" && age >= 56)
printf("\nYou are a wise man!");
else
printf("There has been an error in the program!");
【问题讨论】:
【参考方案1】:这是一个非常很大的问题:
scanf("%s", &manOrFemale);
变量manOrFemale
是单个字符。 "%s"
的格式是读取以null结尾的字节串。
只有一个字符的字符串需要 两个 个字符的空间,以适应空终止符。由于您没有用于终止符的空间,scanf
函数将写入您不拥有的内存,破坏堆栈(编译器通常存储局部变量)导致您得到错误。
如果要读取单个字符,则使用"%c"
格式,如
scanf(" %c", &manOrFemale);
请注意格式字符串中的前导空格,它需要忽略可能的前导空格(如任何先前输入的换行符)。
还请注意,通过比较manOrFemale == "f"
,您将manOrFemale
中的单个字符与字符串 "f"
进行比较。 C 中的文字字符串实际上是一个只读字符数组,并且与任何数组一样,它衰减为指向其第一个元素的指针。所以你不是在比较字符,而是在比较一个字符和一个指针。
你的编译器应该已经警告你了。
要解决此问题,您需要改为与单个字符进行比较:manOrFemale == 'f'
。请注意使用单引号。
最后一个更具风格的注释...
声明
if (manOrFemale == 'f' && age <= 55)
printf("\nYou are a lady at her best!");
else if (manOrFemale == 'f' && age >= 56)
printf("\nYou look young for your age!");
可以改写为
if (manOrFemale == 'f')
if (age <= 55)
printf("You are a lady at her best!\n");
else
printf("You look young for your age!\n");
另外需要注意的是,我在输出中使用了 trailing 换行符。那是因为否则程序完成后可能没有换行符(因此输出似乎与命令行提示混合在一起),而且还因为默认情况下输出到stdout
(printf
写入)是 行缓冲。行缓冲意味着输出在内部被缓冲,直到缓冲区已满,或写入换行后才会真正写入终端。如果您在输出中使用前导换行符,则将写入前一行,而不是当前行。
【讨论】:
也谢谢你:)!。我正在使用 Jetbrain 的 CLion 和学生许可证。【参考方案2】:到目前为止,您正在使用 %s
说明符来读取 char
。
您需要使用%c
说明符来读取char
,%s
用于char *
。
scanf(" %c", &manOrFemale);
和
您需要使用单引号来比较chars
。到目前为止,您正在比较
char
带指针。
if (manOrFemale == 'f'; && age <= 55)
【讨论】:
以上是关于如何修复“调试错误!,变量'x'周围的堆栈已损坏”?的主要内容,如果未能解决你的问题,请参考以下文章