c - 从函数返回结构的更好方法是什么?
问题描述
有多种方法可以从函数返回结构,例如返回整个结构或仅返回指针。返回指针对于避免堆栈开销很有用,因为我们不需要返回整个结构。另一方面,对于小型结构,最好返回整个结构。
在我的情况下,我有以下场景从另一个文件中获取结构并考虑了各种使用方法,但由于我是 C 新手,所以我仍然需要一些专家建议,比如
哪种方法更好?里面有什么问题吗?或对新方法的任何建议?
整体返回大型结构会导致任何堆栈问题吗?
文件1.c
static struct_type mysruct; //Note : here struct size is 250+ bytes
//Method 1
struct_type getStructDataMethod1()
{
return mysruct;
}
//Method 2
void getStructDataMethod2(struct_type *structPtr)
{
if(structPtr != NULL)
{
memcpy(structPtr, &mysruct, sizeof(struct_type));
}
}
//Method 3
void getStructDataMethod3(struct_type *structPtr)
{
*structPtr = mysruct;
}
文件2.c
void myFunction()
{
struct_type mylocalStruct1 = getStructDataMethod1();
struct_type mylocalStruct2;
struct_type mylocalStruct3;
getStructDataMethod2(&mylocalStruct2);
getStructDataMethod3(&mylocalStruct3);
}
解决方案
由于您提到自己的原因,经验法则是始终通过指针而不是通过值将结构传递给函数。如果结构非常小,您应该只对此规则进行特殊情况例外处理。
所以方法2或3都是正确的方法。除了 NULL 指针检查之外,它们是等价的。
与您的问题无关的小问题:永远不要像void myFunction()
在 C 中那样编写函数,这是过时的风格。改为使用void myFunction(void)
。
推荐阅读
- android - 当 dagger 不自动生成组件代码时对 gradle 文件进行故障排除
- clojure - 如何使用 Clojure CLI (tools.deps) 和 figwheel-main 设置 nREPL
- gradle - ubuntu 18 ./gradlew 命令失败
- actionscript-3 - addchild 影片剪辑出现在错误的场景中
- python - 从包含字节数据的字符串中提取字节
- c - 对于数字之间的循环计数
- google-apps-script - Google Apps 脚本:InsertImage() 函数不起作用
- if-statement - Lua 5.2.4:如果语句语法错误,我找不到我的代码有什么问题
- php - 如何过滤 php 对象数组?
- c# - 如何从两个不同的表中检索数据并将其放入 C# 中的两个不同的组合框?