在数组中保存字母表会导致堆栈粉碎错误

时间:2015-05-02 09:13:33

标签: c char ascii

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

该代码有什么问题?

1 个答案:

答案 0 :(得分:2)

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

如果您使用过调试器,那么从一开始就很明显。