如何修复“调试错误!,变量'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 换行符。那是因为否则程序完成后可能没有换行符(因此输出似乎与命令行提示混合在一起),而且还因为默认情况下输出到stdoutprintf 写入)是 行缓冲。行缓冲意味着输出在内部被缓冲,直到缓冲区已满,或写入换行后才会真正写入终端。如果您在输出中使用前导换行符,则将写入前一行,而不是当前行。

【讨论】:

也谢谢你:)!。我正在使用 Jetbrain 的 CLion 和学生许可证。【参考方案2】:

到目前为止,您正在使用 %s 说明符来读取 char。 您需要使用%c 说明符来读取char%s 用于char *

  scanf(" %c", &manOrFemale);

您需要使用单引号来比较chars。到目前为止,您正在比较 char 带指针。

if (manOrFemale == 'f'; && age <= 55)

【讨论】:

以上是关于如何修复“调试错误!,变量'x'周围的堆栈已损坏”?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞