昨天我正在面试一个中级软件工程职位的人,他提到在C中,NULL并不总是零,并且他已经看到了C的实现,其中NULL不为零.我觉得这很可疑,但我想确定.谁知道他是对的?
(回复不会影响我对这位候选人的判断,我已将决定提交给我的经理.)
在测试时NULL,我看到了很多使用的代码!var.有没有理由使用这种测试而不是更明确的测试var == NULL.if (var)对于非空项目,同样也是一个正确的测试?
我不是在发明轮子.在iOS8中,要从应用程序内部打开"设置",我正在使用此代码:
BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);
if (canOpenSettings)
{
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
}
Run Code Online (Sandbox Code Playgroud)
代码在stackoverflow中有很多答案和问题.
问题出现在Xcode 6.3上,我有一个警告说:
Comparison of address of 'UIApplicationOpenSettingsURLString' not equal to a null pointer is always true
有趣的是Apple在他们的示例代码中使用它:https:
//developer.apple.com/library/ios/samplecode/AppPrefs/Listings/RootViewController_m.html
关于如何避免警告并仍然检查我是否可以打开设置的一些想法?
请考虑这样的堆分配的指针数组:
Thing** array = malloc(sizeof(Thing*) * array_length);
Run Code Online (Sandbox Code Playgroud)
如何设置其所有成员为NULL?
我当然可以这样做:
for (int i = 0; i < array_length; i++) {
array[i] = NULL;
}
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有一个标准功能。
SO主要提到memset,但是我不确定在此用例下是否可以保证在所有平台上都可以使用,因为据我所知,它是逐字节而不是逐元素地遍历数组。
同样更普遍的是,将任何类型的数组(T可以是任意大小)中的所有值设置为某个特定值的标准方法是什么?
假设a是一个指针,在为它分配内存之后,我想检查内存是否已成功分配,我已经看到了两种方法:
if(a != NULL)
if(a)
Run Code Online (Sandbox Code Playgroud)
第一个和第二个陈述有什么区别?
我从编译器行为的角度发现了奇怪,它允许赋值布尔值* char.
char * k= false;
Run Code Online (Sandbox Code Playgroud)
为什么?但是在赋值后,char仍未初始化.为什么编译器不允许赋值int?
正如问题所述,我一直在使用NULL和false(在C++中)与0或0x0交替使用,依此类推.我很想知道除了是0的同义词之外他们是否有任何特殊意义.
在C中编码时的常见情况是编写返回指针的函数.如果在运行期间写入函数内发生某些错误,NULL可能会返回以指示错误.NULL只是特殊的内存地址0x0,除了表示特殊条件的出现之外,它从不用于任何东西.
我的问题是,是否有任何其他特殊的内存地址永远不会用于用户态应用程序数据?
我想知道这个的原因是因为它可以有效地用于错误处理.考虑一下:
#include <stdlib.h>
#include <stdio.h>
#define ERROR_NULL 0x0
#define ERROR_ZERO 0x1
int *example(int *a) {
if (*a < 0)
return ERROR_NULL;
if (*a == 0)
return (void *) ERROR_ZERO;
return a;
}
int main(int argc, char **argv) {
if (argc != 2) return -1;
int *result;
int a = atoi(argv[1]);
switch ((int) (result = example(&a))) {
case ERROR_NULL:
printf("Below zero!\n");
break;
case ERROR_ZERO:
printf("Is zero!\n");
break;
default:
printf("Is %d!\n", *result);
break;
}
return 0; …Run Code Online (Sandbox Code Playgroud)