繁体   English   中英

无分段错误

[英]No segmentation fault

#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值是否在小写字母范围内,并且如果我在plain_char输入说A ,那么65-97 = -32数组索引并增加它,是否应该得到分段错误? 但是程序仍然可以正常运行吗?

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

当然,如果您的数组位于内存区域的开头或结尾, 则会出现分段错误。 将数组放入内存的位置由编译器和链接器确定。 当您离开阵列范围时,方法类似。 尝试例如char_freq[2^31]这可能会给您分段错误。

越界写入数组是未定义的行为。 并不奇怪,这意味着该程序的行为未定义, 任何事情都可能发生 可能发生的情况的一些示例:

  • 程序可能崩溃并产生分段错误或类似错误。
  • 该程序可以很好地执行。
  • 该程序似乎可以正常执行,然后崩溃。
  • 该程序可能会破坏自己的变量/自己的堆栈,从而导致任何随机结果。

等等。

您这里的行为不确定,这意味着一切都会发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM