[英]Segmentation Fault in C program that read a text file
我正在写一个小C程序,它读取文本文件并在屏幕上打印它的内容。 我确实得到了打印件,但在打印结束时我遇到了分段错误。 另外,如果我取消注释atoi功能,我只得到第一次打印,然后是分段错误。任何人都可以告诉我我的错误是什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/stat.h> /* For mode constants */
#include <sys/types.h>
#include <fcntl.h> /* For O_* constants */
int sudoku[9][9];
int main(int argc, char *argv[]){
if(argc!=2){
printf("error en numero de parametros, el directorio de archivo de sudoku.\n");
return -1;
}
char *directorio = argv[1];
//printf("el directorio es: %s \n", directorio);
int fp;
fp=open(directorio,O_RDWR);
if(fp<0){
printf("error al leer el archivo");
return -1;
}
char *data = mmap(0, 4096, PROT_READ, MAP_SHARED, fp,0);
if (data == -1) {
perror("mmap");
exit(1);
}
int i=0;
for(i=0; i<81 ; i++){
printf("data : %c \n",data[i]);
//int val =atoi(data[i]);
}
if ((munmap(data,4096)) != 0) perror("!mumap failed");
fclose(fp);
}
如果我取消注释atoi功能,我只得到第一次打印,然后是分段错误。
原因是atoi将参数作为char *,其原型是
int atoi(const char * nptr);
当char作为参数传递时,char的ascii值被视为地址,该值将为(0-255)。 您没有权限访问这些位置,因此分段错误。
您遇到段错误的原因是因为您使用fclose()
来关闭使用open()
打开的文件。
int fclose(FILE *stream)
是fclose()
的函数原型, int close(int fildes)
是close()
的原型。
这意味着fclose()
期望一个FILE指针但是正在接收你声明为int的参数fp
,这就是导致你的段错误的原因。 程序试图访问fp值的内存地址位置,它没有正确的访问权限,因此是段错误。
我编译并运行你的程序用close()
替换fclose()
,我不再有任何段错误问题。
关于你的atoi()
调用,这是由其他海报解释的,是由于atoi(const char *str)
需要一个char指针作为它的参数。 atoi()
接收的不是char指针而是char变量,因此它不会被'\\0'
字符终止,这是使用atoi()
函数进行segfault的原因。
由于您一次操作一个字符,因此使用int val = data[i] - '0'
更有意义。 C中的字符是整数类型,C标准不保证'0'的字符表示在所有实现中都是相同的,例如我机器上的数字零是48,'1'是49,2是50。然而,C标准确实表明,无论数字表示为字符,对于字符“0”到“9”,它们都将比之前的数字高1。 因此,做一小部分char数学你可以得出'2' - '0' = 2
因为'2'是50(在这个系统上)而'0'是48。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.