【问题标题】:core dumped because of a char** write in a file由于 char** 写入文件而导致核心转储
【发布时间】:2022-01-01 23:43:58
【问题描述】:

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

    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  

大家新年快乐 :) 回答问题!!

【问题讨论】:

标签: arrays c pointers struct coredump


【解决方案1】:

它永远不会起作用。您只读取了指针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;
}

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

【讨论】:

  • 非常感谢!!这是否与文件描述符兼容,因为在我们的项目中我们不能使用 FILE 类型,所以每次写入和读取都是通过 write et read 完成的?
  • 是的,你会写得更多
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多