关于返回未初始化的变量(C / Obj-C)

时间:2014-08-31 11:29:04

标签: objective-c c

如果我尝试返回一个未初始化的变量,它会保证该值始终为null /零吗?

例如:

struct Rect rect_with_zero_value(){
    struct Rect aRect;
    return aRect; // Will `aRect` always contain 0 value inside the C struct?
}

void * nullPointer(){
    void * pointer;
    return pointer; // Will `pointer` always be `Null`?
}

更新

我找到了一种方法来确保返回值对于除void类型之外的任何返回类型始终为null / 0:

#define returnNullValue(ReturnType) \
    ReturnType retVal; \
    memset(&retVal, 0, sizeof(ReturnType)); \
    return retVal

struct Rect rect_with_zero_value(){
    returnNullValue(struct Rect); // Return a rect struct which contains 0 value.
}

void * nullPointer(){
    returnNullValue(void *);
}

因为我正在使用C宏进行元编程,所以我需要找到一种通用方法来确保返回值始终为null / 0(如果不是)。我认为这是解决方案。不是吗?

3 个答案:

答案 0 :(得分:3)

没有。它们不是零。

初始化时,只有静态和全局变量的值为零,例如:

void * nullPointer(){
    static void * pointer;
    return pointer; // Now pointer is null
}

void *pointer; //pointer is null
void * nullPointer(){

    return pointer; 
}

答案 1 :(得分:2)

  

如果我尝试返回一个未初始化的变量,它会保证该值始终为null /零吗?

不,至少不是C。

此外:返回一个未初始化的变量会隐含地引发Undefined Behavior,因为返回值意味着读取(local和uninitialised)变量,这反过来会激发UB。

始终在定义上初始化变量:

struct Rect rect_with_zero_value() {
  struct Rect aRect = {0};
  return aRect; 
}

void * nullPointer() {
  void * pointer = NULL;
  return pointer; 
}

如果您不知道将变量初始化为哪个值,则根本不需要它们。

答案 2 :(得分:1)

没有。如果它有保证值,它将被初始化。

未初始化的变量包含半随机垃圾。