gpt4 book ai didi

c - 作为参数接收的指针

转载 作者:行者123 更新时间:2023-11-30 14:33:22 25 4
gpt4 key购买 nike

给出以下代码:

f1() 
{
int *x;
f2(&x);
}

f2(int **x)
{
// Before any processing, make sure that the reference to x is NULL
if (x != NULL)
{
*x = NULL;
}
}

我不确定这段代码是否真的有意义。我想做的是确保指向 x 的指针(在 f1 中声明并由 f2 作为参数接收的指针)为 NULL(因为在声明它的 f1 中它没有初始化为 NULL)。

最佳答案

f1() { int *x;  f2(&x);  }

f2 (int **x) {
// Before any processing, make sure that the reference to x is NULL
if (x != NULL) *x = NULL;
}

在 f1() 中明显存在错误(未初始化的变量),并且您想在 f2() 中测试该错误。实际上,如果变量 x 旨在作为 f2() 的 out 参数,则 f1() 可能没问题,但从这个示例和您的解释来看似乎并非如此。

f2() 可以检查 x 是否为 NULL,但它不能检查其他类型的错误,例如指针错误。在这里,通常在一般的 C 程序中,NULL一个有效值 - 有时(经常)该值用于表示“这个变量还没有值”,或者“我对以下内容不感兴趣”:这个参数”。

f2() 无法以任何方式检查其参数的有效性。使用其他机制,可能高达 99%:例如,如果指针不为 NULL,则取消引用它并检查特殊标记,或者将其传递给可以执行检查的其他函数。无论如何,这很棘手,因为野指针无论如何都会触发异常。而且,即使取消引用指针不会触发异常,并且纯属巧合,在应有的位置有正确的标记,但这并不能保证指针的正确性!

但是,正如上面评论所指出的,问题更广泛。如果被调用的函数发现参数无效,该怎么办?忽略它只是为了避免段错误是一个起点,但不够安全,因为函数的调用者可能期望被调用的函数做一些有用的事情;如果有用的事情没有完成,则必须通知调用者,否则它会继续进行错误的假设。在某些情况下,缺乏检查是可以接受的,但无论如何它们并不优雅。

我在某处读到,对于一个函数来说,检查传入参数的有效性并不总是正确的:以这种方式编写的软件往往会更长、更慢,并且可能有缺陷,因为添加的每一行代码都可能引入错误。一个编写良好的函数应该假设调用者行为良好。也许,在某些危险情况下,进行一些检查仍然是可取的。

关于c - 作为参数接收的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59369587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com