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

C语言中结构体应按值返回还是按指针返回?相关代码场景咨询

在你的场景下,按指针返回更合适

结合你的代码逻辑和两种返回方式的特点,我来帮你拆解分析:

先看你当前的指针返回做法

你的init_game_piece返回GamePiece*,在堆上分配内存后直接把指针插入列表——这种方式完美适配你的使用场景,理由如下:

  • 适配列表存储逻辑:从你给出的insert_item(list, gamePiece)代码能看出来,你的列表是用来存储指针的,直接返回指针插入即可,不需要额外的拷贝或内存分配步骤,代码简洁直观。
  • 效率更高:如果GamePiece结构体包含较多字段(比如棋子类型、位置、状态等),按值返回会触发整个结构体的拷贝操作,开销远大于指针传递。
  • 内存管理可控:你已经明确后续会释放对象,只要在销毁列表时,遍历每个GamePiece*指针调用free,就能避免内存泄漏,逻辑清晰。

需要注意的细节:

  • 确保init_game_piece内部是用malloc(或calloc等堆分配函数)创建的GamePiece,绝对不能返回栈上局部变量的指针(会导致悬垂指针问题)。
  • 列表的insert_item要正确保存指针,不要在未告知的情况下修改指针指向的内存。

再看按值返回的情况

如果改成按值返回GamePiece,你需要大幅调整代码逻辑:

GamePiece gamePiece = init_game_piece(piecesArray[i], isWhite,i,NON_PAWN_ROW_INDEX(isWhite));
// 因为列表存指针,所以需要先分配堆内存再拷贝结构体
GamePiece* piecePtr = malloc(sizeof(GamePiece));
*piecePtr = gamePiece;
insert_item(list, piecePtr);

这种方式的问题在于:

  • 多了一次结构体拷贝和额外的堆分配操作,代码更繁琐,效率也更低(尤其是结构体较大时)。
  • 本质上还是要在堆上分配内存存储列表中的元素,并没有减少内存管理的工作量,反而增加了步骤。

唯一的好处是init_game_piece内部不需要处理堆分配,返回栈上的临时结构体即可,但这对你的场景来说,收益远小于额外的代码复杂度和性能开销。

结论

结合你的使用场景(需要将对象存入指针列表、后续会手动释放内存),继续使用按指针返回的方式是最优选择。只要做好内存管理(分配和释放对应),就能高效、简洁地完成需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:16