没有分段错误

时间:2013-12-13 08:23:04

标签: c

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int char_freq[26] = {0};
    int i = 'a';
    int plain_char = getchar();
    while(plain_char != EOF)
    {
        char_freq[plain_char-'a']++;
        plain_char = getchar();
    }
    while(i <='z')
    {
        printf("%c %d \n",i,char_freq[i-'a'] );
        i++;
    }
    return EXIT_SUCCESS;
}

在上面的程序中,我试图制作一个频率表并使用ASCII值。问题是我没有检查plain_char ASCII值是否在小写字母范围内,如果我输入A中的plain_char然后65-97 = -32数组索引,我增加它,我不应该得到分段错误?但该计划仍然运行良好?

3 个答案:

答案 0 :(得分:3)

当您在程序允许的内存区域之外时,您只会遇到分段错误,超出定义的数组并不意味着您在程序的内存区域之外。然而,它可以读取垃圾数据和/或覆盖程序数据的其他部分,或者在某些情况下甚至可能导致程序代码,这可能导致缓冲区溢出攻击机会。

当然,如果您的数组位于内存区域的开头或结尾,那么 会出现分段错误。数组放入内存的位置由编译器和链接器决定。当你走的时候,类似的方式,你的数组范围。试试例如char_freq[2^31]这可能会给你一个分段错误。

答案 1 :(得分:3)

写出数组的越界是未定义的行为。不足为奇,这意味着没有定义程序的行为,任何事情都可能发生。可能发生的一些例子:

  • 程序可能会崩溃并产生分段错误或类似错误。
  • 该程序可以执行得很好。
  • 该程序可能看起来很好并且稍后会崩溃。
  • 该程序可能会破坏自己的变量/自己的堆栈,导致任何随机结果。

等等。

答案 2 :(得分:0)

这里有一个未定义的行为意味着一切都会发生。