c - 读取文件内容时出现堆 block 错误

标签 c heap-memory fread

我正在尝试编写一个程序,从文件中读取字母“A、B、C、D、E”,记录这些字符的所有实例,并忽略大于号和小于号之间的任何字符, “<和>”。尽管文件似乎已正确打开,但位于 findCommonAnswers() 中的 for 循环似乎访问了 protected 或不存在的值。 Windows 提供了异常代码 c0000005,GNU 调试器告诉我“0xXXXXX 处的堆 block 已在 0xXXXXX+1 处修改,过去的请求大小为 6”。 6这个数字在每次调试中都是不变的。代码的当前输出是“-1.#IND”,在以前的版本中,它为除常量“probabilityArrayLength”之外的所有项目返回零。如果有人可以让我了解错误的性质,将不胜感激。这是我的代码:

#include<stdio.h>
#include<stdlib.h>
...
...
int fsize(FILE *fp)
{

    int prev = ftell(fp);
    fseek(fp, 0L, SEEK_END);
    int sz = ftell(fp);
    fseek(fp,prev,SEEK_SET);    
  return sz;
}

double* findCommonAnswerChoices( )
{
  FILE *data;  
  data = fopen( "F:\\COMP_SCI\\APCalculusBCMultipleChoiceResults.txt", "r" );

int bufferSize = fsize( data ), totalAnswers = 0, instanceOfA = 0, instanceOfB = 0,
instanceOfC = 0, instanceOfD = 0, instanceOfE = 0, probabilityArrayLength =6,    bytesRead = 0;
int j = 0 , k;

double probOfA = 0.0, probOfB = 0.0, probOfC = 0.0, probOfD = 0.0, probOfE = 0.0;
double* probabilities = (double*)malloc( probabilityArrayLength*(sizeof(double)) );

char answers[bufferSize];

if( data==NULL )
{
    printf( "%d %s %d \n",bufferSize, " ", sizeof(data) );
    printf( "Not Enough Memory" );

}
else
{
    bytesRead = fread( answers, 0, bufferSize, data );
}


for( j = 0; j<bytesRead; j++ )
{
    if( answers[j]=='<' )
    {
        do
        {
            j++;
        }
        while( answers[j]!='>' );
    }

    switch( answers[j] )
    {

        case 'A':
            instanceOfA++;
            break;

        case 'B':
            instanceOfB++;
            break;

        case 'C':
            instanceOfC++;
            break;

        case 'D':
            instanceOfD++;
            break;

        case 'E':
            instanceOfE++;
            break;

        default:
            break;
    }

}

fclose(data);

totalAnswers = ( instanceOfA+instanceOfB+instanceOfC+instanceOfD+instanceOfE );
probOfA = ( (double)instanceOfA/(double)totalAnswers );
probOfB = ( (double)instanceOfB/(double)totalAnswers );
probOfC = ( (double)instanceOfC/(double)totalAnswers );
probOfD = ( (double)instanceOfD/(double)totalAnswers );
probOfE = ( (double)instanceOfE/(double)totalAnswers );

probabilities[0] = (double)probabilityArrayLength;
probabilities[1] = probOfA;
probabilities[2] = probOfB;
probabilities[3] = probOfC;
probabilities[4] = probOfD;
probabilities[5] = probOfE;

return probabilities;
}

 int main()
 {
double* something = findCommonAnswerChoices();
int size = (int)something[0];
int p;

for( p = 0; p<size; p++  )
{
    printf( "%g \n", something[p] );
}
free( something );
return 0;
 }

最佳答案

double* probabilities = (double*)malloc( probabilityArrayLength );

这分配了 6 个字节,不足以存储 6 个 double 。应该是:

double* probabilities = malloc(probabilityArrayLength*sizeof(double));

并且您可以省略强制转换,在 C 中您可以将 void* 分配给任何类型的指针。

您的 fsize 方法也有错误,您正在寻找文件的结尾以获取文件的长度,但之后您没有使用 fseek(fp, SEEK_SET) 寻找回到开头

关于c - 读取文件内容时出现堆 block 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564260/

相关文章:

c - 乱码输出

c - strtok() 非常奇怪的行为

javascript - 当ui-router改变状态时, Angular Controller 范围不会破坏变量

c++ - 无法使用 UNICODE 读取文件(存在)

c - 为什么 fread 弄乱了我的字节顺序?

c - 将数据从文件写入 C 上的结构

c - 节省内存,巨大的数组替代c编程

c - 忽略空的可变参数

hadoop - 创建具有较大 (>1GB) BytesWritable 值大小的 SequenceFile 时出现 NegativeArraySizeException

java - 在 EC2 实例上为 Tomcat 分配 Java 堆