最好将指向结构的指针传递给C中的函数

最好将指向结构的指针传递给C中的函数,c,C,通常,最好将指向结构的指针传递给C中的函数,以避免在函数调用期间复制。这有一个不必要的副作用,即被调用的函数可能会无意中修改结构的元素。在不影响函数调用效率的情况下避免此类错误的良好编程实践是什么?将指针传递给const是显而易见的答案 void foo(const struct some_struct *p) 这将防止您无意中修改结构的直接成员。这就是康斯特的作用 事实上,你的问题听起来像是某个问答卡上的复制粘贴,const是期望的答案。传递一个指向const的指针是显而易见的答案 void

通常,最好将指向结构的指针传递给C中的函数,以避免在函数调用期间复制。这有一个不必要的副作用,即被调用的函数可能会无意中修改结构的元素。在不影响函数调用效率的情况下避免此类错误的良好编程实践是什么?

将指针传递给const是显而易见的答案

void foo(const struct some_struct *p)
这将防止您无意中修改结构的直接成员。这就是康斯特的作用


事实上,你的问题听起来像是某个问答卡上的复制粘贴,const是期望的答案。

传递一个指向const的指针是显而易见的答案

void foo(const struct some_struct *p)
这将防止您无意中修改结构的直接成员。这就是康斯特的作用


事实上,您的问题听起来像是某个问答卡的复制粘贴,预期答案是const。

一般来说,当涉及到您所描述的简单优化时,最好使用指向struct的指针,而不是传递struct本身,因为传递整个结构意味着从复制到调用堆栈的额外数据中产生更多开销

以下示例是一种相当常见的方法:

#include <errno.h>

typedef struct myStruct {
   int  i;
   char c;
} myStruct_t;


int myFunc(myStruct_t* pStruct) {
   if (!pStruct) {
      return EINVAL;
   }

   // Do some stuff

   return 0;
}

您还将从阅读中受益。

一般来说,当涉及到您所描述的简单优化时,通常最好使用指向结构的指针,而不是传递结构本身,因为传递整个结构意味着从复制到调用堆栈的额外数据中获得更多开销

以下示例是一种相当常见的方法:

#include <errno.h>

typedef struct myStruct {
   int  i;
   char c;
} myStruct_t;


int myFunc(myStruct_t* pStruct) {
   if (!pStruct) {
      return EINVAL;
   }

   // Do some stuff

   return 0;
}

您还将受益于阅读。

一个非常常见的习惯用法,尤其是在unix/posix样式的系统代码中,就是让调用方分配一个结构,并通过函数调用传递指向该结构的指针

这与我所想的有点不同,你问的是,你在哪里将数据传递到一个有结构的函数中,正如其他人提到的,你可以将结构作为常量来处理。在这些情况下,在函数调用之前,结构为空或仅部分满。调用方将执行类似于分配空结构的操作,然后传递指向该结构的指针。可能与你的一般问题不同,但我认为与讨论有关

这就完成了一些方便的事情。它避免复制可能较大的结构,还允许调用方填写某些字段,被调用方填写其他字段,从而为通信提供有效的共享空间

这个习惯用法最重要的方面是调用方完全控制结构的分配。它可以将它放在堆栈、堆上,重复使用同一个,但调用方负责处理内存


这是传递结构指针的问题之一;您很容易忘记是谁分配了结构,以及谁负责释放结构。这个习惯用法的优点是不必到处复制结构,同时明确谁负责释放内存

一个非常常见的习惯用法,特别是在unix/posix风格的系统代码中,是让调用方分配一个结构,并通过函数调用传递指向该结构的指针

这与我所想的有点不同,你问的是,你在哪里将数据传递到一个有结构的函数中,正如其他人提到的,你可以将结构作为常量来处理。在这些情况下,在函数调用之前,结构为空或仅部分满。调用方将执行类似于分配空结构的操作,然后传递指向该结构的指针。可能与你的一般问题不同,但我认为与讨论有关

这就完成了一些方便的事情。它避免复制可能较大的结构,还允许调用方填写某些字段,被调用方填写其他字段,从而为通信提供有效的共享空间

这个习惯用法最重要的方面是调用方完全控制结构的分配。它可以将它放在堆栈、堆上,重复使用同一个,但调用方负责处理内存


这是传递结构指针的问题之一;您很容易忘记是谁分配了结构,以及谁负责释放结构。这个习惯用法的优点是不必到处复制结构,同时明确谁负责释放内存

这是一道测试题吗?奇怪的是,这是一道测试题吗?奇怪的是,这如何解决被调用函数可以修改元素的不必要的副作用?@rykker过早地点击submit。更新。在我点击提交后看到了+1:@ryker多么讽刺:我们都犯了同样的罪行,尽管我
确实启动了。这如何解决被调用函数可以修改元素的不必要的副作用?@rykker点击submit太早了。更新。在我点击提交后看到了+1:@Ryker多么讽刺:我们都犯了同样的犯规,虽然是我开始的。直到最后一段,你才让我上船。它决不能归结为失去谁拥有一个对象/内存块以及它是如何分配的。现代IDE和工具使这成为一个问题。当然,你不应该忘记谁拥有大量内存。这样做的难易程度各不相同。请记住,这里我们讨论的是C,而不是C++。C++使内存分配完全不同。我同意它们是不同的,我总是发现C比C++更容易跟踪内存。在C语言中,它非常简单。C++中,除非遵守三、等方法的教科书规则,否则必须跟踪构造函数、复制构造函数、赋值构造函数、虚析构函数等之间的细微差别。它决不能归结为失去谁拥有一个对象/内存块以及它是如何分配的。现代IDE和工具使这成为一个问题。当然,你不应该忘记谁拥有大量内存。这样做的难易程度各不相同。请记住,这里我们讨论的是C,而不是C++。C++使内存分配完全不同。我同意它们是不同的,我总是发现C比C++更容易跟踪内存。在C语言中,它非常简单。在C++中,除非遵守三等的教科书规则,否则必须跟踪构造函数、复制构造函数、赋值构造函数、虚析构函数等之间的细微差别。