繁体   English   中英

C程序中的分段错误,读取文本文件

[英]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(con​​st 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM