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

C语言中用printf打印结构体字符指针数组出现乱码问题求助

问题分析与解决

核心问题

你的代码存在两个关键错误:

  1. 打印逻辑错误:serverFrame.name[j]本身就是指向字符串的char*类型,但你错误地取了该指针变量的地址&serverFrame.name[j],把指针自身的内存内容当成字符串打印,导致输出乱码。
  2. 指针未初始化:serverFrame的name数组元素是未初始化的野指针,直接访问会触发未定义行为,表现为乱码或核心转储。

修正方案

1. 修正打印方式

直接使用serverFrame.name[j]作为printf("%s")的参数,因为它本身就是合法的字符串指针:

for(int j=0;j<10;j++){
   printf("%s ", serverFrame.name[j]);  
}

2. 初始化指针数组

必须先让name数组的元素指向有效的字符串,常见方式有两种:

  • 方式1:使用字符串字面量(静态内存,不可修改)
// 单个元素赋值
serverFrame.name[0] = "Alice";
serverFrame.name[1] = "Bob";
serverFrame.name[2] = "Charlie";

// 或者结构体初始化时批量赋值
resFrame serverFrame = {
    .name = {"Alice", "Bob", "Charlie"},
    // 未赋值的元素会自动初始化为NULL
};
  • 方式2:动态分配内存(可修改,需手动释放)
#include <stdlib.h>
#include <string.h>

// 给每个元素分配内存并写入内容
for(int j=0;j<10;j++){
    char* temp = malloc(20); // 预留足够内存存储名字
    if(temp != NULL){
        sprintf(temp, "User_%d", j);
        serverFrame.name[j] = temp;
    }
}

// 使用完毕后释放内存,避免泄漏
for(int j=0;j<10;j++){
    if(serverFrame.name[j] != NULL){
        free(serverFrame.name[j]);
    }
}

3. 空指针判断(推荐)

打印前判断指针是否为NULL,避免访问空指针导致核心转储:

for(int j=0;j<10;j++){
    if(serverFrame.name[j] != NULL){
        printf("%s ", serverFrame.name[j]);
    } else {
        printf("[未初始化] ");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:07:16