尝试将二进制文件中存储的数据打印到动态数组时出现段错误

问题描述 投票:0回答:1

我有一个二进制文件,可以将其存储为带有文本的文本格式:条目oneentry twoentry3(因此,单独的条目是连续的,但是单个条目可以包含两个由空格分隔的单词)

我有此代码:

        char **data;
        int start = 0;

        data = malloc(all_names * sizeof(char*));

        fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
        for(i=0; i<all_names; i++){
            data[i] = malloc((MAX_SIZE+1)*sizeof(char));

            int end = atoi(positions[i]);
            read(fd,&data[i],(end-start));
            start = end;
        }

        for(i=0; i<all_names; i++){
            printf("%s\n", data[i]);
        }

Positions数组包含每个字符串的开始位置,除了第一个。

例如如果positions [0] = 9,则表示第一个条目具有9个字符,第二个条目的第一个字符为字节号9。]

我似乎在尝试打印数组后就出现了分段错误,但是我无法弄清楚它是由于错误的打印或单词未正确存储引起的。

现在,我在创建pos数组时遇到了麻烦,并问了类似的问题here。解决该问题后,此方法不起作用,我尝试了此版本,该版本看起来更像是我对其他问题的回答:

fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
    for(i=0; i<all_names; i++){
        positions[i] =malloc((MAX_SIZE+1)*sizeof(char));
        int end = atoi(positions[i]);

            for(j=0;j<(end-start) ;j++){
                read(fd,&data[i][j],1);
            }
        data[i][j]=0;
        printf("%s\n",data[i]);
     }

和打印时的相同代码,在同一点出现相同的段错误。

我尝试按字符打印字符:

start = 0;
        for(i=0; i<all_names; i++){
            int end = atoi(positions[i]);
            for(j=0;j<(end-start) ;j++){
                printf("%c",data[i][j]);
            }
            printf("\n");
        }

还是同样的问题。多谢您的协助,如果您觉得需要投反对票,请解释原因,以便我改善。如果需要更多信息,我会提供。

我有一个二进制文件,可以将其存储为带有文本的文本格式:条目oneentry twoentry3(因此,单独的条目是连续的,但是单个条目可以包含两个单词...

c segmentation-fault binaryfiles dynamic-arrays
1个回答
1
投票

问题可能是您在读取文件时使用&data[i]获得的不确定的行为。由于data[i]是指向某些数据的指针,因此&data[i]是指向该指针的指针,并且类型为char **

© www.soinside.com 2019 - 2024. All rights reserved.