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
相关产品推荐
相关产品推荐

