2013-12-23 44 views
-2

我有一些问题,当我正在阅读和编写代码时出现..
我已经得到另一种方法,但这个问题仍然在我的脑海里,我没有找到任何好的答案,让我们看看:NULL实现和指针分配

  1. 我可以分配一个指针变量在便携方式,甚至失去 信息?看到的情况,我有一个函数,可以返回NULL,如果一个错误或一个字符,假设NULL是全0,字符 将是nul,这是正确的?

    void * function_returning_null_or_char(); 
    
  2. 一个int变量是否设想保存一个指针? (我在某处读过)..

  3. 我的NULL实现是#define NULL (void *) 0。如果是#define NULL 0,会更好吗?所以 它可以分配给变量和指针,如char或int *。 (请参阅问题1)

  4. 当我将一个指针指向NULL时,当我将它转换为short或char 或另一个类型时,值将为0?或者值将会是 特殊值的NULL,以适合该类型?

我认为,所有问题都在恢复: 编译器是足够聪明,当它被强制转换为一个变量在0 NULL指针转换?

示例代码:

int *p = NULL; 

    char c = (char) p; // This works, I dont know why, and char is equal to '/0'; 

    char c = NULL; //This works because the compiler is smart to convert NULL to '/0' event stddef.h defining NULL as (void *)0; 

    char c = (char) function_returning_null_or_char(); //if this function return NULL whats the value of c? If NULL have a special value, c will have a special value too, or it will be 0? 
+5

你为什么重新定义NULL? –

+1

你只是过于复杂的东西... – JoeC

+0

我没有重新定义任何东西,这是在stddef.h – drigoSkalWalker

回答

3
  1. 它没有意义的,具有可以返回NULL(指针值)或char值的函数。有一个空字符'\0',但它与空指针无关。有多种方法可以使函数返回一个char的值,或者表示没有有效的值。例如,返回一个结构。

  2. 不,int变量不应该保存指针。一个int变量保存一个整数值;拿着一个指针,使用一个指针变量。 (您可以整型和指针类型之间转换,但这样做是有道理的远不往往比你想象的。)

  3. NULL被执行为您定义,在<stddef.h>和其他几个标准的头。不要试图自己重新定义它。

  4. 将空指针值转换为整数类型会生成实现定义的值。如果你关心那个价值是什么,你可能做错了什么。

指针不是整数;不要试图把它们当作整数。空指针的表示是实现定义的;它通常是全零位的,但不能保证。

查看comp.lang.c FAQ,特别是第4部分(指针)和第5部分(空指针)。

+0

感谢您的答案,我已经看过comp.lang.c之前问,这就是错误,因为,C++实现NULL为0,C实现NULL为(void *)0。我想知道这将是更好的C来实现NULL为0,因为它将对指针和nul字符都有用。 – drigoSkalWalker

+1

@drigoSkalWalker; C!= C++。 – haccks

+1

'NULL'不应该用于引用空字符;它是一个空*指针*常量。 C实现可以将'NULL'定义为'((void *)0)'外部括号是必须的)*或*为'0',或者以任何其他形式定义。 C++是一种不同的语言,对空指针常量有不同的要求,C++实现通常将NULL定义为'0'。由实现定义'NULL'的意义在于,你不必关心它是如何定义的。 –