繁体   English   中英

直接从 C 中的 function 调用访问结构元素

[英]Accessing struct element straight from function call in C

我不完全理解直接从 function 调用中获取结构元素是否正常,该调用返回结构(或指向结构的指针),如下面的代码行所示:

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;
}

它返回以下内容:

10 Hello!
20 Hello ptr!

所以我的问题是:在 c99 或 c11 中执行以下操作会产生任何问题或未定义的行为吗?

function().num
ptr_function(&var)->num

您的示例在技术上是正确且安全的。

请注意function()ptr_function(&var)被调用两次。 对于某些功能,这可能是不可取的! 如果您有不同的 function 调用,例如 external outer(function1().value, function2().value) ,则没有指定两个 function 调用的顺序,因此如果它们具有交互的副作用,可能会导致令人讨厌的意外。

该模式的指针版本的另一个可能捕获:如果 function 返回指向已分配 memory 的指针并期望调用者free它,立即使用返回值结果意味着调用者没有保留该指针值并且实际上不能free它稍后。

[对于这样的情况,代码仍然可以:

someType *ptr;
outer_func((ptr = allocating_func())->field);
// ...
free(ptr);

但这变得非常奇怪且难以阅读。 既然你无论如何都需要声明ptr ,为什么不在同一行初始化它呢?]

这不是给定示例的问题,因为指针实际上指向var中的main ,因此它不需要被释放并且在评估->运算符时仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM