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
相关产品推荐
相关产品推荐

