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

为何我的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");仅用于调试)

崩溃原因分析

  1. 格式符不匹配触发非法内存访问:最后一行printf("key: %s", keyi);中,%s要求传入char*类型的字符串指针,但实际传入的是char类型的keyi。程序会把keyi的ASCII值当作内存地址去读取,该地址几乎必然是非法的,直接引发崩溃。你调试时看到在key = key * 2;行崩溃,大概率是调试器断点显示偏差,实际崩溃发生在后续printf调用。
  2. key的计算逻辑完全错误:key += (int)argv[1];是将argv[1]这个字符串指针的内存地址转为int值累加,这显然不符合对用户名字符处理的预期逻辑。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:47:16