为何我的C代码在对int变量执行乘法操作后持续崩溃?
代码崩溃问题的修复思路
原问题代码
#include <stdio.h> int main(int argc, char *argv[]){ if(argc == 2){ printf("username: %s ", argv[1]); int key = 0; key += (int)argv[1]; printf("1 "); key = key * 2; char keyi = (char)key; printf("key: %s", keyi); } return 0; }
(注:原代码中printf("1\n");仅用于调试)
崩溃原因分析
- 格式符不匹配触发非法内存访问:最后一行
printf("key: %s", keyi);中,%s要求传入char*类型的字符串指针,但实际传入的是char类型的keyi。程序会把keyi的ASCII值当作内存地址去读取,该地址几乎必然是非法的,直接引发崩溃。你调试时看到在key = key * 2;行崩溃,大概率是调试器断点显示偏差,实际崩溃发生在后续printf调用。 - key的计算逻辑完全错误:
key += (int)argv[1];是将argv[1]这个字符串指针的内存地址转为int值累加,这显然不符合对用户名字符处理的预期逻辑。 - printf换行符写法不规范:代码中直接换行的写法不符合C语法,会触发编译警告,应使用
\n表示换行。
修复步骤
- 修正printf格式符:将打印
keyi的格式符从%s改为%c(打印字符),若需打印对应ASCII数值则用%d。 - 修正key的计算逻辑:如果要累加用户名所有字符的ASCII值,遍历
argv[1]的每个字符;如果仅取第一个字符,直接使用argv[1][0]。 - 规范换行符写法:把所有换行位置替换为
\n。
修复后的示例代码
#include <stdio.h> #include <string.h> // 用于strlen函数 int main(int argc, char *argv[]){ if(argc == 2){ printf("username: %s\n", argv[1]); int key = 0; // 示例:累加用户名所有字符的ASCII值 for(int i = 0; i < strlen(argv[1]); i++){ key += argv[1][i]; } printf("1\n"); key = key * 2; char keyi = (char)key; printf("key(char): %c\n", keyi); printf("key(int): %d\n", key); // 可选:打印对应数值 } return 0; }
内容的提问来源于stack exchange,提问作者Junus Safsouf
相关产品推荐
相关产品推荐

