int * my_func(void); int result; if (myfunc() != NULL) { result = *myfunc(); }
字符串但是,我不能运行该函数两次。而且我不想仅仅为了检查NULL而使用中间指针。
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测试就足够了?
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); }
型
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中减去它。
typedef
sizeof
2条答案
按热度按时间ej83mcc01#
而且我不想仅仅为了检查NULL而使用中间指针。
修改这个目标。使用中间体。
信任您的编译器,它会发出高效的代码。
如果你的编译器不能产生有效的代码,那就换一个更好的编译器。
字符串
也许 Package
NULL
测试就足够了?型
ltqd579y2#
如果你想做一些可怕的事情,并且被C标准允许但不完全支持,那么在一个没有人能看到的黑暗房间里这样做:
字符串
样品输出:
型
如果您对零长度数组过敏,请在
typedef
中添加一个,然后从sizeof
中减去它。