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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:57:08