C语言Codewars训练代码触发SIGSEGV(11)错误,请求排查问题
解决你的C代码警告与SIGSEGV崩溃问题
我来帮你一步步拆解问题,先理清那些编译警告的含义,再搞定导致程序崩溃的核心错误。
一、先搞懂编译警告的由来
1. 丢弃const限定符的警告
你写了char *a2 = a, *b2 = b,但函数参数a和b是const char *类型。const char*的意思是:通过这个指针不能修改指向的内容(原字符串是只读的)。而char*是允许修改指向内容的指针,把const char*赋值给char*会让编译器担心你可能误操作修改只读内存,所以抛出这个警告。
解决方法很简单:把a2和b2的类型改成const char*——你本来只是遍历统计字符,根本不需要修改原字符串内容,这样既符合逻辑,也消除了警告。
2. 指针转整数的警告
像*a2 = a;这种语句是完全的逻辑错误:
*a2是单个char类型的字符,而a是const char*类型的指针地址。你把一个指针地址(一个大整数)赋值给单个字符变量,不仅类型完全不匹配,还会试图修改原字符串的第一个字符。但原字符串是const修饰的只读内存(比如字符串字面量通常存在只读数据段),这直接为后续的崩溃埋下了伏笔。
你的真实意图应该是重置指针回到字符串的起始位置,所以正确写法是a2 = a;(去掉前面的星号),同理*b2 = b;要改成b2 = b;。
二、导致SIGSEGV崩溃的核心原因
上面提到的*a2 = a;这类错误语句就是崩溃的罪魁祸首:
当你执行*a2 = a;时,你试图把指针a的地址值写入a2指向的只读内存区域,操作系统的内存保护机制会直接拦截这个非法写入操作,抛出SIGSEGV (11)错误——也就是你遇到的“无效内存访问”崩溃。
三、修正后的完整代码
#include <string.h> #include <stdlib.h> #include <ctype.h> char *work_on_strings(const char *a, const char *b) { size_t a_size = strlen(a), b_size = strlen(b), count; // 将a2、b2声明为const char*,避免丢弃const限定符的警告 const char *a2 = a, *b2 = b; char *str = (char*)calloc(a_size + b_size + 1, sizeof(char)); char *base = str; // 保存动态内存的起始地址,用于最终返回 // 处理字符串a的逻辑 while (*a2) { count = 0; b2 = b; // 重置b2到字符串b的起始位置(去掉了错误的星号) while (*b2) { if (*a2 == *b2) { count++; } b2++; } if (count % 2 == 0) { *str++ = *a2; } else { // 用isupper/islower替代直接ASCII范围判断,更健壮 if (isupper((unsigned char)*a2)) { *str++ = tolower((unsigned char)*a2); } else if (islower((unsigned char)*a2)) { *str++ = toupper((unsigned char)*a2); } } a2++; } // 处理字符串b的逻辑 b2 = b; // 重置b2到字符串b的起始位置 while (*b2) { count = 0; a2 = a; // 重置a2到字符串a的起始位置(去掉了错误的星号) while (*a2) { if (*b2 == *a2) { count++; } a2++; } if (count % 2 == 0) { *str++ = *b2; } else { if (isupper((unsigned char)*b2)) { *str++ = tolower((unsigned char)*b2); } else if (islower((unsigned char)*b2)) { *str++ = toupper((unsigned char)*b2); } } b2++; } return base; }
额外优化说明
- 我用
isupper和islower替代了直接的ASCII范围判断,这样处理字符编码更健壮,同时把字符转成unsigned char传入,避免处理负数值(比如某些扩展ASCII字符)。 - 去掉了多余的空
else语句,让代码更简洁。 - 拆分了变量声明,让代码结构更清晰,可读性更强。
内容的提问来源于stack exchange,提问作者Merrifield
相关产品推荐
相关产品推荐

