#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
数组索引,我增加它,我不应该得到分段错误?但该计划仍然运行良好?
答案 0 :(得分:3)
当您在程序允许的内存区域之外时,您只会遇到分段错误,超出定义的数组并不意味着您在程序的内存区域之外。然而,它可以读取垃圾数据和/或覆盖程序数据的其他部分,或者在某些情况下甚至可能导致程序代码,这可能导致缓冲区溢出攻击机会。
当然,如果您的数组位于内存区域的开头或结尾,那么 会出现分段错误。数组放入内存的位置由编译器和链接器决定。当你走的时候,类似的方式,你的数组范围。试试例如char_freq[2^31]
这可能会给你一个分段错误。
答案 1 :(得分:3)
写出数组的越界是未定义的行为。不足为奇,这意味着没有定义程序的行为,任何事情都可能发生。可能发生的一些例子:
等等。
答案 2 :(得分:0)
这里有一个未定义的行为意味着一切都会发生。