C语言使用指针存储用户输入整数的程序运行异常如何解决?
代码存在的问题
- 内存分配大小错误:原代码
numbers = (int*) malloc(sizeof(numberAmount));仅分配了1个int类型的大小,实际需要分配总个数 × 单个int大小的内存,否则会发生内存越界,引发未定义行为。 - 输入逻辑错误:for循环接收用户输入时,每次都将值写入
numbers指向的起始地址,会覆盖之前输入的内容,最终仅保留最后一次输入的整数。 - 输出逻辑错误:使用
while (*numbers != 0)作为输出终止条件不合理:一是用户输入的整数可能本身包含0,会导致输出提前终止;二是未初始化的堆内存值不确定,若内存中没有0会导致越界访问,且输出次数和输入个数不匹配。 - 缺少内存分配成功校验:未判断
malloc返回值是否为NULL,若内存分配失败会引发空指针访问错误。 - 头文件不标准:
malloc.h是非标准头文件,标准C中动态内存分配函数声明在stdlib.h中。 - 内存泄漏风险:申请的堆内存未主动释放,且如果直接修改
numbers指针的指向,会丢失内存起始地址,无法完成后续释放操作。 - 类型强转冗余:C语言中
void*类型可以隐式转换为任意指针类型,malloc返回值不需要强制转换为int*。
修改后的代码
#include <stdio.h> #include <stdlib.h> int main() { int numberAmount = 0; int *numbers = NULL; int *p = NULL; printf("Type the amount of numbers you are going to write: "); scanf("%i", &numberAmount); if (numberAmount == 0) { printf("No numbers were given"); return 0; } // 分配对应大小的内存 numbers = malloc(numberAmount * sizeof(int)); if (numbers == NULL) { printf("Memory allocation failed"); return 1; } // 用临时指针操作,保留malloc起始地址用于释放 p = numbers; // 接收用户输入,通过指针偏移写入对应位置 for (int i = 0; i < numberAmount; i++) { scanf("%i", p + i); } // 回显输出 for (int i = 0; i < numberAmount; i++) { printf("%i ", *(p + i)); } // 释放申请的堆内存 free(numbers); numbers = NULL; return 0; }
如果希望更贴合指针练习的目标,也可以用临时指针自增的方式完成读写,不需要借助下标偏移:
// 输入部分 p = numbers; for (int i = 0; i < numberAmount; i++) { scanf("%i", p); p++; } // 输出部分 p = numbers; for (int i = 0; i < numberAmount; i++) { printf("%i ", *p); p++; }
内容的提问来源于stack exchange,提问作者user16003119
相关产品推荐
相关产品推荐

