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

