由于 char** 写入文件而导致核心转储

core dumped because of a char** write in a file

我在访问我的一个结构中的 char ** 时遇到问题。

    uint64_t id;
    struct timing timing;
    //command *command;
    uint32_t argc;
    char ** argv;
} taskR; 

我正确地存储了我的结构中的所有内容,但是当涉及到从文件中读取它时,我无法访问 argv 部分而没有“核心转储”警报(其他参数工作得很好)

        taskR stp;
        uint64_t ip=stp.id;
        read(i,&stp,sizeof(struct task));
        struct timing ti;
        ti=stp.timing;//all good
        printf("%s",stp.argv[0]);//core dumped  

大家新年快乐 :) 请回答!!

永远行不通。您只读取指针 argv 的值,而不读取分配给它的指针和字符串的引用数组。即使您阅读它,它们在写入时也会引用原始内存区域以外的其他内存区域。

您需要对其进行序列化并保存所有基础数​​据。然后你需要阅读它并重建结构。

示例:

typedef struct
{
    unsigned id;
    unsigned timing;
    //command *command;
    unsigned argc;
    char ** argv;
} taskR; 

char *removeLastLF(char *str)
{
    char *wrk = str;
    if(str && str)
    {
        while(*(str + 1)) str++;
        if(*str == '\n') *str = 0;
    }
    return wrk;
}

int mywrite(FILE *fo, taskR *t)
{
    fprintf(fo, "%u,%u,%u\n", t -> id, t -> timing, t -> argc);
    for(unsigned i = 0; i < t -> argc; i ++)
    {
        fprintf(fo, "%s\n", t -> argv[i]);
    }
    return 0;
}

taskR *myread(FILE *fi)
{
    char buff[128];
    taskR *t = malloc(sizeof(*t));

    if(t)
    {
        fgets(buff, 128, fi);
        if(sscanf(buff, "%u,%u,%u\n", &t -> id, &t -> timing, &t -> argc) == 3)
        {
            t -> argv = malloc(t -> argc * sizeof(*t -> argv));
            for(unsigned i = 0; i < t -> argc; i ++)
            {
                fgets(buff, 128, fi);
                removeLastLF(buff);
                t -> argv[i] = malloc(sizeof(**t -> argv) * strlen(buff) + 1);
                strcpy(t -> argv[i], buff);
            }
        }
    }
    return t;
}

它需要更多的错误检查,但为了简单起见,我跳过了它。