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

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

我有此代码:

        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],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");
        }

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

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

问题可能是您在读取文件时使用&data[i]导致的未定义行为。由于data[i]是指向某些数据的指针,因此&data[i]是指向该指针的指针,其类型为char **

删除地址操作符,仅使用data[i]

,

如“一些程序员花花公子”的回答中所述,从&data[i]中删除&将消除seg错误。我看到了您的评论,但我认为您根本没有在组合代码的正确部分。

        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]);
            lseek(fd,start);
            read(fd,data[i],(end-start));
            start = end;

        }

        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");
        }

这应该很好。

本文链接:https://www.f2er.com/3021612.html

大家都在问