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

C语言中使用scanf()遇不明警告及malloc练习代码问题

问题分析与解决

1. 编译器警告的原因

原代码第17行scanf("%c", ptr[i]);中,scanf的%c格式符要求传入指向char的指针(即内存地址),但ptr[i]是数组中第i个元素的char值,传入时会被隐式提升为int类型,直接导致类型不匹配的警告。你改成&ptr[i]是完全正确的写法,符合scanf的参数要求。

2. 改成&ptr[i]后运行异常的原因

问题出在输入缓冲区的残留换行符:当你用scanf("%d", &d)读取数组长度时,输入完数字后按下回车,这个回车对应的换行符'\n'会留在输入缓冲区里。接下来第一个scanf("%c", &ptr[i])会直接读取这个换行符,而非你手动输入的字符,导致程序看起来跳过了第一次输入,出现运行异常。

3. 完整修正后的代码

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

int main() {

    char *ptr;
    int d;
    
    printf("Inserire la dimensione dell'array CHAR:\n");
    // 检查整数输入是否有效
    if (scanf("%d", &d) != 1 || d <= 0) {
        printf("输入无效的数组长度\n");
        return 1;
    }
    
    ptr = malloc(d * sizeof(char));
    // 检查内存分配是否成功
    if (ptr == NULL) {
        perror("malloc 分配内存失败");
        return 1;
    }
    
    for (int i = 0; i < d; i++) {
        printf("Inserire un char:\n");
        // 格式串前加空格,自动跳过所有空白字符(含残留换行)
        scanf(" %c", &ptr[i]);
    }
    
    printf("你输入的字符数组是:\n");
    for (int j = 0; j < d; j++) {
        printf("%c ", ptr[j]);
    }
    printf("\n");
    
    // 释放内存,避免泄漏
    free(ptr);
    
    return 0;

}

关键修正点

  • 保留&ptr[i]作为scanf参数,匹配%c的指针要求;
  • 在scanf(" %c", &ptr[i])的格式串开头加空格,自动跳过输入缓冲区中的空白字符(包括之前残留的换行符);
  • 增加整数输入的有效性检查,避免非数字或负数输入;
  • 增加malloc返回值检查,防止内存分配失败引发错误;
  • 调用free(ptr)释放内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:18:23