2014-08-31 47 views
0

如果我尝试返回一个未初始化的变量,它会保证该值始终为空/零?关于返回一个未初始化的变量(C/Obj-C)

例如:

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任何返回类型:

#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 *); 
} 

因为我在做metapr使用C宏编程,我需要找到一种通用的方法来确保返回值总是空/零,如果不是。我认为这是解决方案。不是吗?

回答

2

如果我试图返回一个未初始化的变量,将它保证值始终零/零?

否,至少不是C.

此外:返回一个未初始化的变量隐含引发未定义行为,为返回值意味着读取(本地和未初始化)变量,这又引发了UB。

总是初始化变量的定义:

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

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

如果你不知道哪个值初始化变量,你propably并不需要它们。

1

否。如果它有一个保证值,它将被初始化。

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

+1

请问什么意思是“半随机”? – alk 2014-08-31 11:51:14

+1

你应该考虑垃圾是随机的。但事实上,对于那些处于未初始化变量的垃圾,有一些可预测的模式,所以它不是真正的随机。这就是我称之为“半随机”的原因,意思是“毫无意义和任意的,但不是真正的随机和不可预测的”。 – 2014-08-31 11:53:57

3

不,他们不是零。

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

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

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

    return pointer; 
} 
+0

小心点。虽然你当然是正确的做一个变量静态或全局意味着它将被初始化为零,但对于一个天真的读者来说太容易将它误认为是如何改进他们的程序的建议。除非他们真正了解这些变化的含义,否则他们不应该将变量更改为静态或全局变量。这不是避免必须显式初始化应保持本地和自动生命期的变量的方法。 – 2014-08-31 11:51:29

+0

@KenThomases好点。我认为你的评论对于阅读我答案的每个人都是一个足够好的警告。谢谢。 – Igor 2014-08-31 11:53:52

+0

对象指针也初始化为零,这是几年前对Objective-C所做的更改。但是最好的建议是:明确初始化所有变量,这将有助于下一位开发人员更容易地理解代码,并在潜在变量未被初始化时消除奇怪的错误。 – zaph 2014-08-31 12:14:57