由于 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;
}
它需要更多的错误检查,但为了简单起见,我跳过了它。
我在访问我的一个结构中的 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;
}
它需要更多的错误检查,但为了简单起见,我跳过了它。