C将引用传递给参数

C将引用传递给参数,c,C,我在一些遗留C代码中遇到了以下问题: typedef struct _somestruct_ { /* .... */ } SomeStruct_t static void do_one_thing(SomeStruct_t *pInput){ /* Do some read-only stuff with pInput */ } static void do_many_thing(SomeStruct_t input){ do_one_thing(&input

我在一些遗留C代码中遇到了以下问题:

typedef struct _somestruct_ {
 /* .... */
} SomeStruct_t

static void do_one_thing(SomeStruct_t *pInput){
   /* Do some read-only stuff with pInput */   
}


static void do_many_thing(SomeStruct_t input){
   do_one_thing(&input);
}

C是否真的允许这样做,即使如果
do\u one\u thing
被修改为写入
pInput
,事情可能会爆炸?

这是完全合法的C代码。代码
do\u one\u thing(&input)
只是将参数的地址传递给函数
do\u one\u thing
。这没什么错

如果
只做一件事
写入
pInput
,这甚至不是问题。该地址有效,并指向一个可变值。进行更新没有错。考虑

typedef struct _somestruct_ {
 int field;
} SomeStruct_t

static void do_one_thing(SomeStruct_t *pInput){
  // Completely legal  
  pInput->field = 42;
}

static void do_many_thing(SomeStruct_t input){
  do_one_thing(&input);
}

是的,C将允许这样做,
do\u many\u thing
SomeStruct
的副本作为
input
传递,然后将地址传递给
do\u one\u thing
,该地址可以自由读取或写入结构。调用
do\u many\u thing
的调用方不会看到对传递的结构执行任何更改。

这是完全合法的代码。如果do_one_thing写入pInput的数据,它也不会爆炸。如果程序员意识到do_one_do_do_do_many_Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou Dou do

您基本上是在传递一个指针,指向
SomeStruct\u t input
SomeStruct t input
是堆栈上的一个值,
do\u one\u thing
随后将修改堆栈值指针,但调用
do\u many\u thing
C的调用方不会看到任何更改,因此,将指针传递到变量的这种方法是实现相同语义的唯一方法

许多其他语言允许您通过引用直接传递。例如C++中你可以这样做:

static void do_one_thing(SomeStruct_t& Input){
   Input.foo++;   
}
然后,当您调用函数时,您可以这样做:

do_one_thing(input);

但是如果没有这种语言的帮助,您唯一的选择就是指针。

您的代码列表可能不完整,因此不可能确定,但就目前情况来看,它看起来根本不会“爆炸”


do\u many\u thing
作为
input
接收某个结构的副本。然后通过将此副本传递到
do\u one\u thing
中来修改它。除非你依靠的是没有改变的拷贝,否则不会有任何不好的事情发生。此外,
do\u many\u thing
的调用方不会看到传入的
SomeStruct
发生更改,因此即使在更高级别上也不会有副作用。

如果将
*pInput
写入,为什么您希望它会爆炸?我看不出有任何问题。谢谢。我想我得继续寻找那堆乱七八糟的东西是从哪里来的。