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

C语言结构体指针数组使用时成员输出全为0问题求助

问题原因

输出全为0的核心bug在B.c的create_B函数实现中,你没有将传入的x、y参数赋值给结构体对应成员。
代码里写的b->x;、b->y;属于无任何实际作用的空表达式,仅访问了成员但没有执行赋值操作。malloc申请的堆内存内容是未初始化的,你当前运行环境下这块内存默认值恰好为0,所以最终输出全0。
不需要把结构体的x、y成员改成指针类型,你存储的是普通整型值,现有int类型的定义完全正确,改成指针反而会增加不必要的内存管理负担,属于画蛇添足。
A.c中调用create_B的逻辑没有问题。

修复方案

修改B.c中的create_B函数,补充赋值逻辑和内存申请失败判断:

#include "B.h"

B_ptr create_B(int x, int y) {
    B_ptr b = (B_ptr)malloc(sizeof(B));
    if (!b) { // 必须判断malloc返回值,内存申请失败时直接返回NULL
        return NULL;
    }
    b->x = x; // 将入参x赋值给结构体成员
    b->y = y; // 将入参y赋值给结构体成员
    return b;
}
额外注意事项
  • 编译代码时建议加上-Wall -Wextra警告参数,上述无效空表达式的问题会被编译器直接标记为“无效果语句”警告,不需要等到运行时才排查到问题。
  • 你当前代码缺少内存释放逻辑,使用完申请的堆内存后需要逐层释放,避免内存泄漏:先遍历list_of_10_pointers逐个释放每个B实例,再释放指针列表本身,最后释放A实例。
  • 你之前注释掉的list[i] = (B_ptr)malloc(sizeof(B));写法和调用create_B的本质逻辑一致,只是create_B把内存申请和初始化的逻辑做了封装,是更合理的代码组织方式。

修复后重新编译运行,输出会符合预期:第i项(i从0开始计数)的x值为i+1,y值为i+2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:24:13