直接从 C 中的函数调用访问结构元素
Accessing struct element straight from function call in C
我不完全理解直接从 returns 结构(或指向结构的指针)的函数调用中获取结构元素是否正常,如以下代码行所示:
function().num
ptr_function(&var)->num
下面是我编写的代码示例,它在我的系统上编译和运行没有任何问题。
#include <string.h>
#include <stdio.h>
#define LEN 32
typedef struct
{
int num;
char str[LEN];
} myType;
myType function( void )
{
myType var;
var.num = 10;
strncpy( var.str, "Hello!", LEN );
return var;
}
myType* ptr_function( myType* var )
{
var->num = 20;
strncpy( var->str, "Hello ptr!", LEN );
return var;
}
int main()
{
/* 1st example */
printf( "%d %s\n", function().num, function().str );
/* 2nd example */
myType var;
printf( "%d %s\n", ptr_function(&var)->num, ptr_function(&var)->str );
return 0;
}
它 returns 以下内容:
10 Hello!
20 Hello ptr!
所以我的问题是:在 c99 或 c11 中执行以下操作是否会引起任何问题或未定义的行为?
function().num
ptr_function(&var)->num
您的示例在技术上是正确且安全的。
请注意 function()
或 ptr_function(&var)
被调用了两次。对于某些功能,这可能是不可取的!如果您有不同的函数调用,例如 outer(function1().value, function2().value)
,则未指定两个函数调用的顺序,因此如果它们具有相互作用的副作用,可能会导致令人讨厌的意外。
模式指针版本的另一个可能陷阱:如果函数 return 是指向已分配内存的指针,并期望调用者 free
它,立即使用 return 值结果意味着调用者没有保留该指针值并且实际上不能 free
它以后。
[对于这样的情况,代码仍然可以做到:
someType *ptr;
outer_func((ptr = allocating_func())->field);
// ...
free(ptr);
但这变得很奇怪并且难以阅读。既然你无论如何都需要声明 ptr
,为什么不在同一行初始化它呢?]
这不是给定示例的问题,因为指针实际上指向 main
中的 var
,因此它不需要被释放并且在 ->
运算符被评估。
我不完全理解直接从 returns 结构(或指向结构的指针)的函数调用中获取结构元素是否正常,如以下代码行所示:
function().num
ptr_function(&var)->num
下面是我编写的代码示例,它在我的系统上编译和运行没有任何问题。
#include <string.h>
#include <stdio.h>
#define LEN 32
typedef struct
{
int num;
char str[LEN];
} myType;
myType function( void )
{
myType var;
var.num = 10;
strncpy( var.str, "Hello!", LEN );
return var;
}
myType* ptr_function( myType* var )
{
var->num = 20;
strncpy( var->str, "Hello ptr!", LEN );
return var;
}
int main()
{
/* 1st example */
printf( "%d %s\n", function().num, function().str );
/* 2nd example */
myType var;
printf( "%d %s\n", ptr_function(&var)->num, ptr_function(&var)->str );
return 0;
}
它 returns 以下内容:
10 Hello!
20 Hello ptr!
所以我的问题是:在 c99 或 c11 中执行以下操作是否会引起任何问题或未定义的行为?
function().num
ptr_function(&var)->num
您的示例在技术上是正确且安全的。
请注意 function()
或 ptr_function(&var)
被调用了两次。对于某些功能,这可能是不可取的!如果您有不同的函数调用,例如 outer(function1().value, function2().value)
,则未指定两个函数调用的顺序,因此如果它们具有相互作用的副作用,可能会导致令人讨厌的意外。
模式指针版本的另一个可能陷阱:如果函数 return 是指向已分配内存的指针,并期望调用者 free
它,立即使用 return 值结果意味着调用者没有保留该指针值并且实际上不能 free
它以后。
[对于这样的情况,代码仍然可以做到:
someType *ptr;
outer_func((ptr = allocating_func())->field);
// ...
free(ptr);
但这变得很奇怪并且难以阅读。既然你无论如何都需要声明 ptr
,为什么不在同一行初始化它呢?]
这不是给定示例的问题,因为指针实际上指向 main
中的 var
,因此它不需要被释放并且在 ->
运算符被评估。