Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个循环在文件缓冲区上迭代会引发错误的访问异常?_C_Pointers_File Io_Buffer - Fatal编程技术网

C 为什么这个循环在文件缓冲区上迭代会引发错误的访问异常?

C 为什么这个循环在文件缓冲区上迭代会引发错误的访问异常?,c,pointers,file-io,buffer,C,Pointers,File Io,Buffer,我花了好几个小时来研究这个问题,不明白为什么循环会尝试访问越界内存。。。。任何帮助都将不胜感激 int CountCharacters(FILE *fp, const char* filename){ // Get file size fseek(fp, 0L, SEEK_END); long size = ftell(fp); if (size == -1){ perror("Failed: "); return 0;} rewind(fp); //s

我花了好几个小时来研究这个问题,不明白为什么循环会尝试访问越界内存。。。。任何帮助都将不胜感激

int CountCharacters(FILE *fp, const char* filename){
    // Get file size
    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);
    if (size == -1){ perror("Failed: "); return 0;} 
    rewind(fp); //seek back to file's beginning

    // Allocate approrpiately sized buffer ( size + 1 for null-termination)
    char *buf = malloc(sizeof (char) * (size + 1)); 

    // Read the entire file into memory
    size_t newLen = fread(buf, sizeof(char), size, fp);
    if ( ferror( fp ) != 0 ) {
        fputs("Error reading file", stderr);
    } else {
        buf[newLen++] = '\0'; /* Just to be safe. */
    }

    //Try to get byte count from buffer
    int byte_count[256] = {0}; //initialize character counts to 0
    for (int i = 0; i < size; ++i){
        byte_count[(int) buf[i]]++; //BAD ACCESS ERROR HERE
    }

    /* Do something with byte_count here */

    return (1);
}
int CountCharacters(文件*fp,常量char*文件名){
//获取文件大小
fseek(fp,0L,SEEK_END);
长尺寸=ftell(fp);
如果(size=-1){perror(“失败”);返回0;}
倒带(fp);//查找回文件的开头
//分配适当大小的缓冲区(空终止时大小+1)
char*buf=malloc(sizeof(char)*(size+1));
//将整个文件读入内存
size_t newLen=fread(buf,sizeof(char),size,fp);
如果(费罗(fp)!=0){
fputs(“读取文件时出错”,stderr);
}否则{
buf[newLen++]='\0';/*为了安全起见*/
}
//尝试从缓冲区获取字节计数
int byte_count[256]={0};//将字符计数初始化为0
对于(int i=0;i
如果将buf声明为
无符号字符*buf
?当出现访问错误时,您是否检查了
buf[i]
的值?@Renat哇,看起来是这样做的!这是否意味着坏访问来自字节计数数组,而不是buf?这是否回答了您的问题?基本上,buf包含负数,然后将其用作字节计数的索引。为了更好地调试,可以将行拆分为单独的指令。这样你就能准确地看到哪里出了问题。您可以插入
printf()
assert()
或您认为适合调试的内容。如果将buf声明为
无符号字符*buf
,您在发生访问错误时检查了
buf[i]
的值吗?@Renat哇,看起来这就成功了!这是否意味着坏访问来自字节计数数组,而不是buf?这是否回答了您的问题?基本上,buf包含负数,然后将其用作字节计数的索引。为了更好地调试,可以将行拆分为单独的指令。这样你就能准确地看到哪里出了问题。您可以插入
printf()
assert()
或您认为适合调试的内容。