C++ C++;分段故障测试代码昨天运行良好,现在它出现故障了

C++ C++;分段故障测试代码昨天运行良好,现在它出现故障了,c++,segmentation-fault,C++,Segmentation Fault,截至目前,该程序统计ASCII码中每个字符的出现次数,昨天测试时,即使是在我尝试过的最大案例(小说《哈克·芬恩》)中,它也能完美地工作,没有错误。我今天加载并再次测试了它,它给了我一个分段错误。我没有更改或添加任何代码。这就是昨天完美运行的代码。我不明白它是如何工作的,而不是第二天。运行调试器时,我得到以下信息: Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7343f01 in getc () f

截至目前,该程序统计ASCII码中每个字符的出现次数,昨天测试时,即使是在我尝试过的最大案例(小说《哈克·芬恩》)中,它也能完美地工作,没有错误。我今天加载并再次测试了它,它给了我一个分段错误。我没有更改或添加任何代码。这就是昨天完美运行的代码。我不明白它是如何工作的,而不是第二天。运行调试器时,我得到以下信息:

    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff7343f01 in getc () from /lib64/libc.so.6
我的代码:

#include <cstdio>

using namespace std;

//==============================================================
//                  initialize
//==============================================================
// initialize(freq) initializes all values in the array pointed
// to by freq to 0.
//==============================================================
void initialize(int* freq)
{
   for(int i = 0; i<=256; i++)
   {
      freq[i]=0;
   } 
}

//==============================================================
//                  getFreq
//==============================================================
// getFreq(inf, freq) counts the number of occurences of each
// character in file inf and stores those numbers into the array
// freq at with the index number being the ASCII code for that 
// character
//==============================================================

void getFreq(FILE* inf, int* freq)
{
   int c = fgetc(inf);
   while(c != EOF)
   {
      freq[c]++;
      c = fgetc(inf);
   }  

}

//==============================================================
//                  showCount
//==============================================================
// showCount(freq) prints the counts of the characters stored in
// freq at with the indexs being the ASCII code for each charater.
// *Does not print characters that do not occur
//==============================================================

void showCount(int* freq)
{
   for(int i = 0; i <= 256; i++)
   {
      if(freq[i]> 0)
      {
         if(i == ' ')
         {
            printf("Spaces: %i \n", freq[i]);
         }
         else if(i == '\n')
         {
            printf("Newlines: %i \n", freq[i]);
         }
         else if(i == '\t')
         {
            printf("Tabs: %i \n", freq[i]);
         }
         else if(i == '.')
         {
            printf("Periods: %i \n", freq[i]);
         }
         else
         {
            printf("%c's: %i \n",i , freq[i]);
         }
      }
   }
}

int main(int argc, char* argv[])
{
   int* freq = new int[256];
   initialize(freq);
   FILE* inf = fopen(argv[1], "r");
   getFreq(inf, freq);
   showCount(freq);
   fclose(inf);
}​
#包括
使用名称空间std;
//==============================================================
//初始化
//==============================================================
//初始化(freq)初始化数组中的所有值
//按频率到0。
//==============================================================
无效初始化(int*freq)
{

对于(int i=0;i您正在使用i您没有检查
fopen
的返回值,也没有通过访问数组外部的元素(从0到255的数组的索引256)来溢出缓冲区。

您正在分配256个int,但初始化257(0-256)。此外,memset对于内存归零非常有用。为什么要滚动自己的?动态分配freq的任何原因?如果int永远不能低于0,为什么要使用int?如果不释放内存,为什么要关闭文件)这两个都不重要)?为了避免此类问题,请使用
std::vector
而不是动态分配的数组。不保证,但会出现“索引超出范围”之类的问题可能会被识别并生成可读的错误消息,而不是分段错误。另外,为什么要为freq动态分配内存?只需声明一个数组
intfreq[256]
忽略我习惯于将输入重定向到文件的问题,我没有注意到我这样做而不是将其作为命令行参数。对不起。好吧,我做了一个测试,以显示它是否在文件中读取,而不是在文件中读取。为什么它会在一天而不是第二天读取它?@DMG-当您溢出缓冲区时这个程序的行为是不明确的。这就是C++的工作方式——这样做一个错误,所有的赌注都被关闭了。@ dmg要么是保罗的回答或文件许可问题,要么是文件在错误的目录中。如果<代码> fOpen< <代码>失败,你可以调用<代码> Pror <代码>,以得到文件未被发现或权限错误的确切问题。或者别的什么。是的,我注意到在我提交问题后我就出界了。它仍然不能解决问题。我做了一个测试,以显示它是否在文件中读取,而不是。为什么它会在一天内读取而不是第二天?看看你的initialize()函数。不能保证在您将0分配给freq[256]后,它会返回。一旦您这样做,任何事情都可能发生,包括“正在工作”或者当场崩溃。感谢您指出了超出范围的错误。虽然我习惯于将输入重定向到文件,但没有注意到我正在这样做,而不是将其作为命令行参数。