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