如何处理C/ c++指针的歧义?



假设我们有一个简单的函数定义…

void fun(type* var);

我怎么知道在函数....

  • 传递指向类型变量的指针,假设函数需要只指向一个元素的指针…
type ch = ...;
fun(&ch);
  • 传递类型数组,假设函数需要许多类型…
type chArr[] = {...};
fun(chArr);

我知道,我知道数组保存了第一个元素的地址,所以你总是可以为每个指针创建一个类型数组,其中有一个值,代码将是相同的。但是我怎么知道它是想要1还是>1值??

当我们必须传递char*时,情况变得更糟,因为我们无法知道函数是否需要空终止符来退出操作…

  • 传递指向char变量的指针,假设函数只需要指向一个char元素的指针…
char ch = 'A';
fun(&ch);
  • 传递char数组,假设函数需要许多char元素,最后有一个空指针…
type chArr[] = "ABC";
fun(chArr);

我知道,你通常从文档中知道要在代码中放入什么,但仍然…你怎么知道的?

我怎么知道在函数....

但是我怎么知道它是否需要1或>1值??

如果只看函数的声明,您无法确定(除非声明用SAL注释装饰,而您的示例没有)。正如您所说,函数可能需要指向单个对象的指针,或者指向对象数组的指针。因此,要确定预期的行为,您必须查看函数的文档,或者查看函数的实现代码(如果您可以访问它)。

首先,您应该不应该尝试根据是否将函数参数声明为

来决定这一点。
type *arg

type arg[]

type arg[]形式表明指针可能指向多个对象的数组。但是许多程序员拒绝这种形式(正是因为它可能会令人困惑),而一直使用type *arg形式。

一般规则:

  1. 如果它是一个char *指针,它很有可能指向一个以空结束的字符串。
  2. 如果旁边有int nitemssize_t arrsize参数,则指针可能指向给定大小的元素数组。
  3. 否则,如果只有一个指针参数而没有'size'参数,那么它可能指向单个项目。(标准示例为ctimestat)

但是函数的文档应该总是说。

我该如何知道在函数....

Pass a pointer to a type variable, assuming that function needs only pointer to one element...

[…]

Pass type array, assuming that function needs many types...

首先,从被调用者的角度来看,它们之间没有本质的区别。观察,例如……

type chArr[1] = {...};
fun(chArr);

。也就是说,指向标量的指针可以被视为指向单元素数组的第一个元素的指针(根据语言规范,这是显式的)。

我知道,我知道数组保存着第一个元素的地址,所以你总是可以为每个指针创建一个类型数组,其中有一个值,代码是一样的。但我怎么知道它是想要1还是>1值? ?

你怎么知道任何函数做什么,或者它对参数的期望是什么,不管它们的类型是什么?一般来说,我们依赖文档,即使是我们自己编写的函数。(你确实清晰而仔细地记录了你的代码,对吗?未来的你,谢谢你。)

当我们必须传递char时情况变得更糟,因为我们无法知道函数是否需要 null终止符来退出操作…*

不,没有更糟。没有特别的理由假设先验地接受其他类型数组的函数不依赖于它的结束被哨兵值标记。

我知道,你通常从文档中知道要输入什么代码,但仍然…你怎么知道的?

你可以试着从函数名、参数名和类型以及函数的返回类型中猜测,但这只是给你一个假设。也许这是一个很好的假设,但是那样你得不到任何确定的信息。

如果你没有文档,或者它是不完整的,或者你不相信它,那么最终的求助就是查看代码。最好是源代码,但反汇编的目标代码也可以工作,如果你是绝望的。但是如果你没有可以依赖的文档,那么你应该强烈考虑这个选项,把这个函数扔掉,或者至少避免直接使用它。

相关内容

  • 没有找到相关文章

最新更新