【问题标题】:Saving alphabet in array gets stack smashing error在数组中保存字母会导致堆栈粉碎错误
【发布时间】:2015-07-12 02:10:04
【问题描述】:

这是一个简单的程序,用于保存和显示数组中的所有 ASCII 字母:

#include <stdio.h>

int main(void) {

        int j = 0;
        char alpha[52];

        for (i=65;i<=122;i++) {
                if (i<=90 || i>=97) {
                        alpha[j] = i;
                }
                j++;
        }

        printf("\n");
        return 0;
}

得到以下错误:

*** stack smashing detected ***: ./program.c terminated
Canceled (Created core dump)

那段代码有什么问题?

【问题讨论】:

  • 好吧,当它只包含 52 个元素时,您正在设置 alpha[57]...

标签: c char ascii


【解决方案1】:

问题只是数组 alpha 被创建为大小为 52 个元素,但是您插入到循环中最后一个元素的末尾之后,因为您增加了数组索引变量 j outside if 声明。像这样向数组中添加元素时,将 j 增量代码移动到 if 块中

for (i=65;i<=122;i++) 
{
    if (i<=90 || i>=97) 
    {
        alpha[j] = i;
        j++;  /* place the increment here */
    }
    /* instead of here */
}

这可确保您仅在实际写入数组时才增加 j。不这样做会导致j 大于 51,这是您可以写入的最高索引,而不会超过数组末尾。

您的代码允许j 超过51,此时i 的值也在满足if 条件的范围内 - 所以您写信给alpha[j] 并写过去数组边界会导致未定义的行为。

如果您使用了调试器,这从一开始就很明显。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多