使用strcat()时触发Segmentation fault的问题求助
解决strcat()触发Segmentation Fault的问题
核心错误分析
你的代码里最致命的问题是**srt_cmm的指针覆盖**:
- 你先通过
malloc(500)在堆上分配了可写内存给srt_cmm,但紧接着执行srt_cmm = "sort ";,这会让srt_cmm直接指向只读数据段的字符串常量,完全丢失了之前malloc的堆内存地址。 strcat()需要修改目标字符串的内存空间,但字符串常量是只读的,写入操作直接触发段错误。
其他潜在问题
token未初始化就使用:strstr(token, str_chr1)里的token是野指针,直接访问会导致未定义行为,可能提前崩溃或逻辑混乱。file_name内存管理错误:你先给file_name分配堆内存,之后又让它指向strtok返回的指针(通常指向输入字符串的栈内存区域),后续free(file_name)会尝试释放非堆内存,引发错误。execvp参数格式错误:execvp的第二个参数要求是以NULL结尾的字符串数组,你传&srt_cmm不符合规范,会导致调用失败。
修复后的代码示例
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(int argc, char* argv[]) { // 示例:假设输入来自命令行或用户输入,先初始化token char input[] = "sort < test.txt"; char* token = strtok(input, " "); char* file_name; char* srt_cmm = (char*)malloc(500); const char* str_chr1 = "<"; // 检查malloc是否成功 if (srt_cmm == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 用strcpy将字符串常量复制到堆内存,而非直接赋值指针 strcpy(srt_cmm, "sort "); while (token != NULL) { if (strstr(token, str_chr1) != NULL) { token = strtok(NULL, " "); file_name = token; // 检查缓冲区是否足够,避免溢出 if (strlen(srt_cmm) + strlen(file_name) + 1 > 500) { fprintf(stderr, "Buffer overflow risk\n"); free(srt_cmm); exit(EXIT_FAILURE); } strcat(srt_cmm, file_name); // 构建execvp要求的参数数组(以NULL结尾) char* args[] = {"sort", file_name, NULL}; execvp("sort", args); // 若execvp返回,说明调用失败 perror("execvp failed"); free(srt_cmm); exit(EXIT_FAILURE); } token = strtok(NULL, " "); } free(srt_cmm); return 0; }
关键修复点说明
- 用
strcpy替代指针赋值:确保srt_cmm指向可写的堆内存,而非只读的字符串常量。 - 初始化
token:必须让token先指向有效的输入字符串,避免野指针访问。 - 修正
execvp参数:构建符合要求的字符串数组,让系统调用能正确识别命令参数。 - 检查缓冲区容量:避免
strcat导致的缓冲区溢出,也可以用strncat进一步提升安全性。 - 合理管理内存:不再对
file_name做不必要的malloc,直接使用strtok返回的指针即可(如需保存副本再单独分配内存)。
内容的提问来源于stack exchange,提问作者Pdom
相关产品推荐
相关产品推荐

