C语言 如何检查一个函数是否返回一个NULL指针并直接解引用它,而不使用一个一次性的中间指针变量?

4zcjmb1e  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(156)
int * my_func(void);

int result;
if (myfunc() != NULL) {
    result = *myfunc();
}

字符串
但是,我不能运行该函数两次。而且我不想仅仅为了检查NULL而使用中间指针。

ej83mcc0

ej83mcc01#

而且我不想仅仅为了检查NULL而使用中间指针。
修改这个目标。使用中间体。

信任您的编译器,它会发出高效的代码。

如果你的编译器不能产生有效的代码,那就换一个更好的编译器。

int * my_func(void);

int result;
int *ptr = myfunc();
if (ptr != NULL) {
    result = *ptr;
} else {
  ; // TBD code: what to do when `ptr` is NULL?
}

字符串
也许 Package NULL测试就足够了?

#include <stdio.h>

int wrapper_int(int *ptr, int deefault) {
  return ptr ? *ptr : deefault;
}

int* my_func(void);

int main() {
  #define NULL_DEFAULT 42

  int result1 = wrapper_int(my_func(), NULL_DEFAULT);
  printf("%d\n", result1);

  int result2 = wrapper_int(my_func(), NULL_DEFAULT);
  printf("%d\n", result2);
}

ltqd579y

ltqd579y2#

如果你想做一些可怕的事情,并且被C标准允许但不完全支持,那么在一个没有人能看到的黑暗房间里这样做:

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>

//  Create dummy function for demonstration.
int *myfunc(int *p) { return p; }

static void Demo(int *p)
{
    //  Create a type, not a variable.
    typedef char T0[(uintptr_t) myfunc(p)];
    if (sizeof (T0))
    {
        int *result = (int *) sizeof (T0);
        printf("myfunc returned non-null %p.\n", (void *) result);
    }
    else
        printf("myfunc returned null.\n");
}

int main(void)
{
    Demo(NULL);
    Demo((int []) {0});
}

字符串
样品输出:

myfunc returned null.
myfunc returned non-null 0x7ffee75d29fc.


如果您对零长度数组过敏,请在typedef中添加一个,然后从sizeof中减去它。

相关问题