C语言指针数组存储字符串后printf无输出问题求助
问题分析与代码修复
你的代码无输出的核心原因是未定义行为,具体问题出在姓名存储部分:
char *names[3]是包含3个字符指针的数组,但这些指针没有指向任何已分配的有效内存。当你用scanf("%s", names[i])(你的写法&(*(names+i))等价于此)读取姓名时,输入的字符串会被写入随机内存地址,破坏程序内存结构,可能导致程序在执行printf前崩溃,或后续输出无法正常执行。
修复方案1:使用固定大小二维字符数组(简单易用)
直接为每个姓名分配固定内存,适合确定姓名长度范围的场景:
#include<stdio.h> int main() { // 为3名学生各分配20字节的姓名存储空间(可按需调整) char names[3][20]; int test1[3], test2[3], test3[3]; for(int i=0; i<3; i++) { // %19s 限制输入长度,避免缓冲区溢出 scanf("%19s", names[i]); scanf("%d", &test1[i]); scanf("%d", &test2[i]); scanf("%d", &test3[i]); } int j=0; while(j<3) { int total = test1[j] + test2[j] + test3[j]; // 合并printf语句,简化代码 printf("%s %d %.1f\n", names[j], total, total / 3.0); j++; } return 0; }
修复方案2:动态分配内存(灵活适配任意姓名长度)
如果不确定姓名最大长度,可通过动态内存分配避免内存浪费:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *names[3]; int test1[3], test2[3], test3[3]; char temp_buf[100]; // 临时存储输入的姓名 for(int i=0; i<3; i++) { // 先读取到临时缓冲区 scanf("%99s", temp_buf); // 根据姓名实际长度分配内存(+1 用于存储字符串结束符 '\0') names[i] = malloc(strlen(temp_buf) + 1); // 检查内存分配是否成功 if(names[i] == NULL) { printf("内存分配失败\n"); return 1; } // 复制姓名到分配的内存中 strcpy(names[i], temp_buf); scanf("%d", &test1[i]); scanf("%d", &test2[i]); scanf("%d", &test3[i]); } int j=0; while(j<3) { int total = test1[j] + test2[j] + test3[j]; printf("%s %d %.1f\n", names[j], total, total / 3.0); // 释放动态分配的内存,避免内存泄漏 free(names[j]); j++; } return 0; }
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

