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

C语言动态分配数组输出末尾元素总返回0.0求代码修正

问题原因
  • 数组下标越界:for循环的终止条件是i < DynArraylen,循环结束后i的值等于数组长度,而C语言数组下标从0开始,最后一个有效元素的下标为DynArraylen - 1,原代码访问DynArray[i]属于越界读取未初始化内存,输出结果异常。
  • 命令行参数转换错误:argv[1]存储的是字符串类型的参数,不能直接强制转为int整数,需要调用atoi()函数完成字符串到数值的转换,原代码的强制转换实际是将字符串的内存地址转为整数,得到的数组长度完全不符合预期。
  • 内存检查逻辑错误:argc==2分支中先操作DynArray[0]再检查malloc返回值,若内存申请失败会直接触发段错误。
修正后代码
#include <stdio.h>
#include <stdlib.h>

#define last_digit_of_Matrikelnummer 5

int main(int argc, char* argv[])
{
    int i;
    int DynArraylen;
    double* DynArray;

    if (argc == 1)
    {
        DynArraylen = last_digit_of_Matrikelnummer;
        DynArray = (double*)malloc(DynArraylen * sizeof(double));
        // 立刻检查内存申请结果
        if (DynArray == NULL)
        {
            printf("out of memory\n");
            return 1;
        }

        DynArray[0] = 0.0;
        for (i = 1; i < DynArraylen; i++)
        {
            DynArray[i] = DynArray[i - 1] + 0.1;
        }
        // 访问最后一个有效元素
        printf("My last array element is: %.1f\n", DynArray[DynArraylen - 1]);

        free(DynArray);
    }
    else if (argc == 2)
    {
        // 字符串转整数
        DynArraylen = atoi(argv[1]);
        DynArray = (double*)malloc(DynArraylen * sizeof(double));
        if (DynArray == NULL)
        {
            printf("out of memory\n");
            return 1;
        }

        DynArray[0] = 0.0;
        for (i = 1; i < DynArraylen; i++)
        {
            DynArray[i] = DynArray[i - 1] + 0.1;
        }
        printf("My last array element is: %.1f\n", DynArray[DynArraylen - 1]);

        free(DynArray);
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者Chang-Min Yu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 02:45:04