我试图一次将一个字符添加到一个名为buffer的char数组中。当我尝试添加一个字符缓冲[count]时,我得到一个分段错误。但是,如果我尝试将字符添加到缓冲区[0],缓冲区[1]或任何其他整数偏移量,它运行正常。这是我的代码:
#include <stdio.h>
int main(int argc, char *argv[]){
FILE * fp;
char buffer[100];
fp = fopen(*(argv+1), "r");
if(fp == NULL){
printf("File \"%s\" not found!\n", *(argv+1));
return 0;
}
int curr_char;
unsigned int count = 0;
unsigned int min_len;
while(!feof(fp)){
curr_char = fgetc(fp);
if((curr_char >= 32) && (curr_char <= 126)){
buffer[count] = curr_char;
printf("%c", curr_char);
count++;
if(!((curr_char >= 32) && (curr_char <= 126))){
break;
}
}
}
}
为什么不允许缓冲区[count]?
答案 0 :(得分:3)
当缓冲区的大小只有100时,如何像buffer[453]
这样访问位置453?这是UB。
答案 1 :(得分:1)
char buffer[100];
您只能从buffer[0]
访问buffer[99]
。
在您的代码中count
可能超过99
,因此可能存在段错误。
答案 2 :(得分:1)
如果您的输入文件超过100个字符,那么count
将大于100,并且您将遇到缓冲区溢出,即未定义的行为,分段错误是常见的可能性之一。
您的代码中的另一个常见问题是您错误地使用feof()
,请参阅“while( !feof( file ) )” is always wrong。
答案 3 :(得分:0)
当你说char buffer[100]
它为ram分配100个字节时,你可以访问仅分配给你的内存。从地址1001到1100说。当你试图说buffer[453]
时,它会在内部转换成*(buffer + 453)
其中缓冲区基址为1001.并且向其添加453然后尝试访问第1454个字节,这是不允许的,因为它可能导致严重的问题,例如(从其他进程访问数据等)。所以内核通过发送信号SIGSEGV
编辑:因为它计算您的读取文件可能有超过100个字节。这也不在你的过程范围内。尝试增加缓冲区大小说char buffer[1024]