将字母表保存在数组中会出现堆栈粉碎错误

Saving alphabet in array gets stack smashing error

这是一个简单的小程序,用于保存和显示数组中的所有 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)

该代码有什么问题?

问题很简单,数组 alpha 被创建为大小为 52 个元素,但是您在循环中插入了最后一个元素的末尾,因为您增加了数组索引变量 j 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] 并写入数组边界会导致未定义的行为。

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