直接从 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,因此它不需要被释放并且在 -> 运算符被评估。