为什么'strcpy'会导致'core dumped'错误?[关闭]

sbdsn5lh  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(118)

**已关闭。**此问题需要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”包含表示文件路径的字符串。

9fkzdhlc

9fkzdhlc1#

你没有努力去做MCVE。如果你做了,你会注意到下面的几行足以重现这个问题,

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

字符串
当您在注解代码中使用strdup时,标准库会为您分配一个新的缓冲区,并将token复制到其中,然后将指向该缓冲区的指针返回给您,您可以将其保存以供以后使用。
如果你像这样使用strcpy,情况就不是这样了。你必须自己分配缓冲区,然后复制到它。正如所写的那样,你只对transfer_file_listchar*数组执行分配,但是在分配之后,transfer_file_list[token_count]没有初始化,因此持有不确定的值。在stdcpy中使用不确定的值会导致未定义的行为。
正确的方法是分配缓冲区来保存字符串,

char** newptr = realloc(transfer_file_list, (token_count + 1) * sizeof(char *));
        if(!newptr){
            //handle error
            return NULL;
        }
        transfer_file_list = newptr;
        transfer_file_list[token_count] = malloc(strlen(token)+1);
        if(!transfer_file_list[token_count]){
            //handle error
            return NULL;
        }
        strcpy(transfer_file_list[token_count], token);


请注意,在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,对应的代码应该是

char** newptr = realloc(transfer_file_list, (token_count + 1) * sizeof(char *));
        if(!newptr){
            //handle error
            return NULL;
        }
        transfer_file_list = newptr;
        size_t token_len = strlen(token);
        transfer_file_list[token_count] = malloc(token_len+1);
        if(!transfer_file_list[token_count]){
            //handle error
            return NULL;
        }
        strncpy(transfer_file_list[token_count], token, token_len+1);

相关问题