**已关闭。**此问题需要debugging details。目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
18天前关门了。
Improve this question
char **file_update_check(char *sync_file_path, file_Info_t *file_list, char **transfer_file_list)
{
FILE *sync_file = NULL;
sync_file = file_open(sync_file_path, "r");
static char line[512];
memset(line, 0, sizeof(line));
int token_count = 0;
int found = 0;
int file_list_index;
while (fgets(line, sizeof(line), sync_file) != NULL)
{
char *token = strtok(line, " \n");
if (token == NULL)
{
continue;
}
found = 0;
file_list_index = 0;
while (file_list[file_list_index].path[0] != '\0')
{
if (strcmp(file_list[file_list_index].path, token) != 0)
{
file_list_index++;
continue;
}
if (file_list[file_list_index].update_time == file_update_time(token))
{
found = 1;
break;
}
file_list_index++;
break;
}
if (found)
{
continue;
}
transfer_file_list = realloc(transfer_file_list, (token_count + 2) * sizeof(char *));
// transfer_file_list[token_count] = strdup(token);
strcpy(transfer_file_list[token_count], token);
transfer_file_list[token_count][MAX_PATH_LENGTH - 1] = '\0';
token_count++;
//transfer_file_list[token_count] = NULL;
}
我尝试在以下代码中使用“strcpy”将“token”复制到“transfer_file_list[token_count]”,但结果是"Segmentation fault(core dumped)'错误并终止。我不确定这个问题的原因是什么。当我在评论部分使用'strdup'时,它可以正常工作,但'strcpy'或'strncpy'给我错误。请提供一个正确的代码使用'strcpy'或'strncpy',如果可能的话,解释背后的原因。
“transfer_file_list[token_count]”正在被分配“token”的值。“token”包含表示文件路径的字符串。
1条答案
按热度按时间9fkzdhlc1#
你没有努力去做MCVE。如果你做了,你会注意到下面的几行足以重现这个问题,
字符串
当您在注解代码中使用
strdup
时,标准库会为您分配一个新的缓冲区,并将token
复制到其中,然后将指向该缓冲区的指针返回给您,您可以将其保存以供以后使用。如果你像这样使用
strcpy
,情况就不是这样了。你必须自己分配缓冲区,然后复制到它。正如所写的那样,你只对transfer_file_list
char*
数组执行分配,但是在分配之后,transfer_file_list[token_count]
没有初始化,因此持有不确定的值。在stdcpy
中使用不确定的值会导致未定义的行为。正确的方法是分配缓冲区来保存字符串,
型
请注意,在
realloc
的情况下,您永远不应该覆盖初始指针,也就是说,ptr = realloc(ptr, ...)
总是错误的。这是因为如果分配失败,您需要以某种方式释放原始ptr
以防止内存泄漏,但如果您使用ptr = realloc(ptr, ...)
,您将不再能够访问原始指针。我也不明白为什么你需要分配
token_count+2
。我从来没有看到你需要使用索引token_count+1
,所以分配给token_count+1
应该就足够了。另外请注意,您正在使用
char **transfer_file_list
作为参数,调用者将无法从参数中看到新的transfer_file_list
值。请确保将新的transfer_file_list
值返回给调用者。第
transfer_file_list[token_count][MAX_PATH_LENGTH - 1] = '\0';
行也是错误的。首先,在使用strcpy
时,您永远不需要显式分配NUL字符,它总是自动处理的。其次,不能保证缓冲区长度与MAX_PATH_LENGTH
一样长,并且您很可能正在写入transfer_file_list[token_count]
的越界地址。如果存在这一行,即使使用strdup
,代码也有未定义的行为。最后,对于
strncpy
,对应的代码应该是型