If you need to return a struct
from a function, you would normally return a pointer to the struct
instead.
If you then want to return an array of structs, is it recommended to:
I have drawn a diagram for the two options below:
1:
2:
Given the following struct definition
struct values {
int a;
int b;
};
here is some sample code for accessing the fields of the structs from the two options:
Option #1:
struct values *vals = get_values1();
printf("%d, %d\n", values[0].a, values[1].b);
Option #2:
struct values **vals = get_values2();
printf("%d, %d\n", values[0]->a, values[1]->b);
我看到不使用版本1的唯一问题是,在第二个版本中识别结构(返回)的数量可能更容易,因为NULL
指针可以用作止动元素,而在第一个版本中它可能不可能定义止动元件。
Unless you have a good reason to return a pointer to pointers (for example, if you want to modify the pointers themselves later on), I think a pointer to the struct is good enough. No need to trick around with double pointers.
As an example for a beginners book on C, the question would clearly be satisfied better by option 1 (no indirection) as was pointed out by the answers so far. If there is more to the question however (eg which is the best way to pass around structs in a large framework) then I would certainly go for option 2. Why? structs are complex units of data and tend to become standalone entities which are allocated and passed around and disposed in differing ways - all code that handles them by direct access will need a rewrite if data handling becomes more complex.
For me, as the number of indirections grow, the code complexity grows even faster. Thus I prefer your Option #1: struct values *foo()
.
Should data requirements push toward #2: struct values **foo()
, suggest creating a new type typedef struct values *ValuesSet
and returning a pointer to that: ValuesSet *foo()
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.