【问题标题】:Error: Stack around the variable "m" is corrupted错误:变量“m”周围的堆栈已损坏
【发布时间】:2020-11-03 12:50:01
【问题描述】:

我正在尝试制作一个程序来说明特定数字在 100 数字序列中出现的次数。 同时我得到了这个错误,我不明白这个问题的解决方案是什么。如果您能给我一些提示或解决方案,我将不胜感激。

#include <stdio.h>

int main() {
int i, m, digit, val[99], count=0;

printf("Enter a number:");
scanf("%d", &val[0]);
while (val[0] < 0) {
    printf("Enter a number:");
    scanf("%d", &val[0]);
}

for (i=1;i<101;i++) {
    val[i]=val[0]++;
    printf("%d\n", val[i]);
}

printf("Enter a digit:");
scanf("%d", &m);
while (m<0||m>9) {
    printf("Enter a digit:");
    scanf("%d", &m);
}

do {
    digit=val[i]%10;
    val[i]=val[i]/10;
    if (digit==m) {
        count++;
    }
}while (val[i]>0);

printf("The digit %d is printed %d times in this sequence.", m, count);

}

【问题讨论】:

  • 当您声明大小为 99 时访问val[100],您认为会发生什么?

标签: c variables


【解决方案1】:

在 for 循环中,您跳出数组 val,其中最后一个索引是 98。与其在多个位置硬编码数组的长度,使用长度更方便宏,像这样:

#define LEN(anArray) (sizeof (anArray) / sizeof (anArray)[0])
...
for (i = 1; i < LEN(val); i++) {
...

此外,在 do-while 循环中,索引 i 位于 val 的数组边界之外。您还需要检查 scanf 的返回值以确保输入有效。最后一个 printf 语句还需要一个尾随换行符。

编辑:注意 LEN 只处理“真实”数组;传递给函数的数组作为指针接收。

【讨论】:

  • @WhozCraig 确实,但这是因为 arr 是指针而不是数组。
【解决方案2】:

你只分配了int /* ... */ val[99](只有val[0]val[98]可用)并且访问到val[100],因为循环条件是i&lt;101

这将导致危险的超出范围写入(undefined behaior)。

分配足够的元素,如int /* ... */ val[101] 或修复循环条件以不导致超出范围的访问。

另外,您没有在for (i=1;i&lt;101;i++) 循环之后设置i 的值,因此未初始化元素的值将在do ... while 循环中使用。非静态局部变量的未初始化元素的值是不确定的,使用该值会调用未定义的行为。 在循环之前将i 设置为适当的值或将索引i 更改为适当的值。

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2012-11-08
    • 2019-09-04
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多