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()
或您认为适合调试的内容。