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

无法理解代码为何抛出异常,请求分析C语言代码问题

你的C语言代码异常问题分析与修复方案

Hey,我仔细排查了你代码里的问题,这几个bug是导致程序抛出异常的核心原因,咱们一个个来看:

一、Main函数里的两个致命问题

1. scanf语句漏写取地址符&

你代码第32行的scanf("%d,size")完全写错了——scanf要想把用户输入的数值存到变量里,必须传入变量的内存地址,正确写法应该是scanf("%d", &size)。漏写&会让程序把一个随机的内存地址传给scanf,直接触发内存访问异常,或者导致变量值乱掉。

2. 未清理输入缓冲区的换行符

执行完scanf后,用户输入完回车的换行符会留在输入缓冲区里,如果后续还有读取字符串(比如用gets或者scanf("%s"))的操作,程序会直接把这个换行符当成输入内容,导致逻辑异常。所以必须在scanf之后加一句getchar();来清除这个残留的换行符。

二、createArr函数的malloc参数错误

你第48行的malloc调用犯了一个新手常见的错误:malloc的参数要求是总字节数,而不是数组的元素个数。对于int类型的数组,每个元素占sizeof(int)字节(通常是4字节),所以正确的写法应该是malloc(len * sizeof(int))。如果只传len,相当于只分配了len个字节的空间,远不够存len个int元素,后续访问数组的时候必然会越界,触发内存异常。

修复后的完整代码示例

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// 动态创建int数组的函数声明
int* createArr(int len);

int main() {
    int size;
    printf("请输入数组长度:");
    // 修复:添加取地址符&,正确读取输入
    scanf("%d", &size);
    // 修复:清除输入缓冲区的换行符
    getchar();
    
    int* arr = createArr(size);
    // 额外建议:检查malloc是否成功
    if (arr == NULL) {
        printf("内存分配失败,程序退出!\n");
        return 1;
    }
    
    // 这里可以添加数组的使用逻辑,比如赋值、打印等
    
    // 额外建议:记得释放动态分配的内存,避免内存泄漏
    free(arr);
    return 0;
}

int* createArr(int len) {
    // 先判断长度是否合法
    if (len <= 0) {
        return NULL;
    }
    // 修复:计算正确的内存字节数
    int* arr = (int*)malloc(len * sizeof(int));
    // 可选:初始化数组元素为0
    if (arr != NULL) {
        memset(arr, 0, len * sizeof(int));
    }
    return arr;
}

额外小建议

  • 给main函数和其他函数加注释,说明功能和参数含义,方便自己后续维护或者别人阅读
  • 永远记得检查malloc的返回值,内存分配失败是很常见的情况,必须做错误处理
  • 使用完动态分配的内存后一定要调用free,不然会造成内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:14