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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:20:22