C语言程序手动运行正常但测试用例在指定行崩溃(字符串匹配场景)
问题根源:试图修改只读的字符串字面量
这个崩溃的核心原因非常明确:你的测试用例中,传递给主程序的argv[1]指向的是一个只读的字符串字面量,而主程序里的argv[i][j] = tolower(argv[i][j]);试图修改这个只读内存,直接触发了段错误(SIGSEGV)。
为什么手动运行没问题?
当你通过shell执行./a.out Dumb时,shell会负责解析命令行参数,把这些参数复制到可写的内存区域(通常是进程栈或者堆的一部分),然后传递给程序的argv。这时候你修改argv里的字符串内容是完全合法的,不会触发内存访问错误。
测试用例哪里错了?
看你的Test.c代码:
array[1] = "Dumb";
这里的"Dumb"是一个字符串字面量,在C语言中,字符串字面量默认存储在程序的只读数据段(.rodata)中,操作系统会把这块内存标记为不可写。当主程序试图通过argv[i][j] = tolower(...)修改这个地址的内容时,CPU会触发内存保护异常,导致程序崩溃。
如何修复?
你需要把字符串字面量复制到一块可写的内存中,再赋值给array[1]。可以用strdup(需要包含<string.h>),或者手动malloc加strcpy:
方案1:使用strdup
#include <string.h> // 要包含这个头文件 int unit_test(void) { int retval; char **array; array = malloc(sizeof(char *) * 2); array[0] = strdup("./a.out"); // 同样建议复制,避免潜在问题 array[1] = strdup("Dumb"); retval = __hide_main__(2, array); // 注意要逐个释放复制后的字符串 free(array[0]); free(array[1]); free(array); return retval; }
方案2:手动malloc+strcpy
#include <string.h> int unit_test(void) { int retval; char **array; array = malloc(sizeof(char *) * 2); // 复制第一个参数 array[0] = malloc(strlen("./a.out") + 1); strcpy(array[0], "./a.out"); // 复制第二个参数 array[1] = malloc(strlen("Dumb") + 1); strcpy(array[1], "Dumb"); retval = __hide_main__(2, array); // 依次释放内存 free(array[0]); free(array[1]); free(array); return retval; }
额外的小问题提醒
你的主程序里还有一个明显的错误:char *pch = strstr(argv[i], echo);中的echo变量没有定义,应该是你之前定义的needle吧?改成strstr(argv[i], needle)才能正确执行子串查找逻辑。
内容的提问来源于stack exchange,提问作者Mohammad Sohaib
相关产品推荐
相关产品推荐

