You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:18