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

C语言char指针传参取值异常,调用函数触发段错误

问题分析与解决:传单个char指针触发段错误的原因

核心问题

你调用code(&l)时出错的根本原因是:l是单个char变量,它的内存地址后面没有字符串结束符'\0'。

C语言中,strlen函数的工作逻辑是从传入的指针位置开始,逐个读取字节,直到遇到'\0'才停止计数。当你传&l时,strlen会越过l的内存空间继续向后读,直到找到一个随机的'\0'——这属于未定义行为,轻则计算出错误的字符串长度,重则直接访问到受保护的内存区域,触发段错误。

而你传"a"时能正常运行,是因为"a"是字符串字面量,编译器会自动在其末尾添加'\0',strlen("a")能正确识别这是长度为1的字符串。

解决方案

方案1:构造合法的以'\0'结尾的字符串再传参

在循环中,不要直接传&l,而是创建一个长度为2的字符数组,将l存入数组第一个位置,第二个位置手动添加'\0',确保是合法字符串:

int code(char* mot){
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    if (strlen(mot) > 1){
        int longueur = strlen(mot);
        int resultat = 0;
        for (int i=1; i<longueur+1; i++){
            char l = mot[i-1];
            printf("%c\n", l);
            // 构造合法字符串
            char temp_str[2];
            temp_str[0] = l;
            temp_str[1] = '\0';
            resultat += pow(26, (i-1))*code(temp_str);
        }
        return resultat;
    } else if (strlen(mot) == 1){
        char letter = *mot;
        char* pPosition = strchr(alphabet, letter);
        int index = -1; // 初始化默认值,避免未赋值返回
        if (pPosition != NULL){
            index = pPosition - alphabet + 1;         
        }
        return index;
    } else {
        printf("ERROR: length of word not valid");
        return -1;
    }
}

方案2:拆分逻辑,避免递归传指针

把单个字符的处理抽成独立的辅助函数,递归时直接传字符值而非指针,从根源上避免字符串结束符的问题:

// 单独处理单个字符的辅助函数
int char_to_code(char c) {
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    char* pPosition = strchr(alphabet, c);
    if (pPosition != NULL) {
        return pPosition - alphabet + 1;
    }
    return -1; // 字符不在字母表中时返回错误值
}

int code(char* mot){
    int len = strlen(mot);
    if (len > 1){
        int resultat = 0;
        for (int i=1; i<=len; i++){
            char l = mot[i-1];
            printf("%c\n", l);
            resultat += pow(26, (i-1))*char_to_code(l);
        }
        return resultat;
    } else if (len == 1){
        return char_to_code(*mot);
    } else {
        printf("ERROR: length of word not valid");
        return -1;
    }
}

额外提示

pow是浮点型函数,计算整数幂时可能存在精度误差(比如pow(26,2)可能返回675.999999,强制转成int会变成675而非预期的676)。建议自己实现一个整数幂函数,避免这类问题:

int int_power(int base, int exp) {
    int result = 1;
    for (int i=0; i<exp; i++){
        result *= base;
    }
    return result;
}

然后把代码中的pow(26, (i-1))替换成int_power(26, i-1)即可。

内容的提问来源于stack exchange,提问作者Witzig Adrien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:02:02