为何使用strcpy复制字符串会触发Segmentation fault (core dumped)错误?
问题分析与解决
错误原因
你用strcpy触发段错误的核心问题是没给transfer_file_list[token_count]分配实际存储字符串的内存:
realloc(transfer_file_list, (token_count + 2) * sizeof(char *))只是扩容了「指针数组」的空间——让数组能多装几个char*类型的指针,但这些指针本身都是野指针,指向的是不确定的非法内存区域。直接用strcpy往野指针指向的地址写数据,必然触发内存访问错误。- 而
strdup(token)会自动完成两步操作:先根据token的实际长度分配足够的内存,再把token的内容复制过去,最后返回这块内存的指针,所以能正常运行。
正确代码示例
用strcpy的实现
transfer_file_list = realloc(transfer_file_list, (token_count + 2) * sizeof(char *)); // 先为当前字符串分配内存:strlen(token)+1 包含字符串本身和结束符'\0' transfer_file_list[token_count] = malloc(strlen(token) + 1); if (transfer_file_list[token_count] == NULL) { // 处理内存分配失败的情况,避免内存泄漏 perror("malloc failed"); for (int i = 0; i < token_count; i++) { free(transfer_file_list[i]); } free(transfer_file_list); return NULL; } strcpy(transfer_file_list[token_count], token); token_count++; transfer_file_list[token_count] = NULL; // 标记数组末尾,方便外部遍历
用strncpy的更安全实现(避免超长字符串溢出)
transfer_file_list = realloc(transfer_file_list, (token_count + 2) * sizeof(char *)); // 按定义的MAX_PATH_LENGTH分配内存,预留结束符空间 transfer_file_list[token_count] = malloc(MAX_PATH_LENGTH); if (transfer_file_list[token_count] == NULL) { perror("malloc failed"); // 清理已分配内存,防止泄漏 for (int i = 0; i < token_count; i++) { free(transfer_file_list[i]); } free(transfer_file_list); return NULL; } // 最多复制MAX_PATH_LENGTH-1个字符,手动补结束符 strncpy(transfer_file_list[token_count], token, MAX_PATH_LENGTH - 1); transfer_file_list[token_count][MAX_PATH_LENGTH - 1] = '\0'; token_count++; transfer_file_list[token_count] = NULL;
额外注意事项
- 每次
malloc后必须检查返回值,避免内存分配失败导致后续错误 - 外部使用完
transfer_file_list后,要先逐个释放每个字符串的内存,再释放指针数组本身,彻底避免内存泄漏 - 必须加上
transfer_file_list[token_count] = NULL;,这样外部遍历数组时才能识别结束位置
内容的提问来源于stack exchange,提问作者이호섭
相关产品推荐
相关产品推荐

