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

C语言:malloc分配内存后打印垃圾值,需实现索引0-15对应值1-16

问题排查与修复方案

核心问题分析

  • 未初始化内存直接读取:malloc分配的内存不会自动初始化,内部是随机的垃圾值,直接打印自然得不到预期结果。
  • 内存分配与索引不匹配:你需要的是索引0到15(共16个元素),但代码只分配了15个int的空间(15 * sizeof(*ptr)),有效索引范围是0-14。循环中i<=15会访问ptr+15,属于数组越界访问,触发未定义行为。
  • 未给元素赋值:代码完全没有给ptr指向的内存写入你期望的数值(索引n对应n+1),这是最根本的缺失。

修复后的代码

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

int main(void)
{
    // 分配16个int的空间,对应索引0-15
    int *ptr = (int*)malloc(16 * sizeof(*ptr)); 

    if (ptr != NULL)
    {
        // 先给每个元素赋值:索引i对应值i+1
        for(int i=0; i<16; i++)
        {
            *(ptr + i) = i + 1;
        }
        // 打印所有元素
        for(int i=0; i<16; i++)
        {
            printf("Value of element [%d] is: %d\n", i, *(ptr+i));
        }
        // 释放malloc分配的内存,避免内存泄漏
        free(ptr);
    }
    else
    {
        printf("Memory allocation is not sufficient");
    }
    return 0;
}

额外说明

  • 使用完动态分配的内存后,必须用free释放,这是C语言避免内存泄漏的基本习惯。
  • 循环从0开始索引,符合C语言数组的默认索引规则,能有效降低越界风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:10:25