【问题标题】:Pass an int pointer then check for a value or null传递一个 int 指针,然后检查一个值或 null
【发布时间】:2016-11-05 17:21:36
【问题描述】:

我想将 ptr 传递给函数并让函数确定该值是数字还是 NULL。这样做的原因是为了避免编写两个函数,一个来检查 C 内置函数中通常返回的错误指示符。

目前,我正在使用两个重复的函数,一个用于检查返回的 int-1,另一个用于检查返回的 char *ptrNULL。这在某种程度上违反了 DRY,因为这两个函数的操作在测试之外是相同的。我曾考虑编写第三个函数来处理该操作,但我想与社区核实一下,看看是否有更好的方法。

我想要完成的示例代码:

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>

typedef union combo_tag {
    int i;
    FILE *fp;
} combo;

int foo(combo test) {
    if (test.fp == NULL || test.i == -1) {
        printf("error\n");
        return -1;
    }
    return 0;
}

int main() {
    combo a;

    // attempt to produce an error
    a.fp = fopen("/tmp/somthing-that-does-not-exist/file", "a");
    a.i  = socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);

    return foo(a);
}

【问题讨论】:

  • 一个 int 不能为空。您可以将 a 声明为 int* 并将其设置为 null。
  • 另外,您应该检查ptr == NULL || *ptr == -1。这样你就可以在取消引用 null 之前短路。并且您应该通过打印到屏幕以外的方式来指示错误。除此之外,您的foo 是正确的。
  • 如果你想使用 foo 进行任何有意义的工作流控制,你仍然需要再次在调用者中处理它的结果。
  • @o_weisman NULL 在许多系统上的值为 0,而令人惊讶的是,int 的类型经常是。所以虽然int 可以有NULL 的值,但这不是OP 需要编码的。
  • 你真正的问题是你没有统一的错误检查系统。让你的所有函数都返回一个错误代码,例如enum,然后检查那个。我建议你解决这个真正的问题,而不是创建一些丑陋的人为补丁。

标签: c pointers null


【解决方案1】:

根据您的代码,如果未分配指针,当您尝试尊重它时它会崩溃。所以最好在比较整数值之前验证指针值。

 #include <stdio.h>

// pass a pointer
int foo(int *ptr) {

    // match for int by dereference or if ptr is null
    if (ptr == NULL) 
    {
        printf("match\n");
    } 
    else if(*ptr == -1 )
    {
       printf("match\n");
    }
    return 0;
}

int main() {
    // make a an int
    int a = -1;

    // attempt to make int null?
    a = NULL;

    foo(&a);
    return 0;

}

【讨论】:

  • 关于短路的好点,但这不是我想要的解决方案。我很抱歉,因为我的询问没有明确表达。
【解决方案2】:

或者你可以像这样改变条件的顺序:

// 传递一个指针 int foo(int *ptr) {

// match for int by dereference or if ptr is null
if ((ptr == NULL) || (*ptr == -1)) {
    printf("match\n");
}
return 0;

}

如果为NULL指针,则条件匹配,无需解引用。

【讨论】:

  • 关于短路的好点,但这不是我想要的解决方案。我很抱歉,因为我的询问没有明确表达。
猜你喜欢
  • 2015-03-08
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多