无分段故障 #包括 #包括 int main(int argc,char*argv[]) { int char_freq[26]={0}; int i='a'; int plain_char=getchar(); while(纯字符!=EOF) { 字符频率[普通字符-'a']++; 普通字符=getchar(); } 虽然(i

无分段故障 #包括 #包括 int main(int argc,char*argv[]) { int char_freq[26]={0}; int i='a'; int plain_char=getchar(); while(纯字符!=EOF) { 字符频率[普通字符-'a']++; 普通字符=getchar(); } 虽然(i,c,C,只有当您在程序允许的内存区域之外时,才会出现分段错误,在定义的数组之外并不意味着您在程序的内存区域之外。但是,它可以读取垃圾数据和/或覆盖程序数据的其他部分,在某些情况下,甚至可以覆盖程序的代码,从而导致d缓冲区溢出攻击机会 当然,如果数组位于内存区域的最开始或最末尾,则会出现分段错误。数组放入内存的位置由编译器和链接器决定。类似的情况是,数组超出了数组范围。请尝试egchar\u freq[2^31]这可能会给您带来分段错误。只有当您在程序允许的内存区域之外时,才会出现分段错误,在定义的数组之

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


当然,如果数组位于内存区域的最开始或最末尾,则会出现分段错误。数组放入内存的位置由编译器和链接器决定。类似的情况是,数组超出了数组范围。请尝试eg
char\u freq[2^31]
这可能会给您带来分段错误。

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


当然,如果数组位于内存区域的最开始或最末尾,则会出现分段错误。数组放入内存的位置由编译器和链接器决定。类似的情况是,数组超出了数组范围。请尝试eg
char\u freq[2^31]
这可能会给你一个分段错误。

你这里有一个未定义的行为,这意味着一切都可能发生。

你这里有一个未定义的行为,这意味着一切都可能发生。

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

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

以此类推。

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

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

依此类推。

我怎么知道我的程序分配了多少内存?@user2688772你不应该关心。你应该只关心显式分配的内存。(我们也应该说是进程而不是程序)我怎么知道我的程序分配了多少内存?@user2688772你不应该关心。你应该只关心你显式分配的内存。(我们也应该说是进程而不是程序)+1,但我会质疑你的“不太令人惊讶”。我的经验是,人们经常对“未定义的行为”如此未定义感到非常惊讶@ Rukh人,他们一直在问“如何定义行为不明确的行为”,可能应该考虑不同的职业。或者他们会发现自己编写的代码如“代码”>如果被定义的行为表现为(行为);我的经验是,人们常常对“未定义的行为”有多么不明确感到惊讶。@ Rukh的人总是问诸如“如何定义行为不明确的行为”,可能应该考虑不同的职业。或者他们会发现自己编写的代码如<代码>,如果定义的行为表现为(行为)。#endif。
#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;
}