初始化char []的困惑

时间:2012-05-15 14:49:51

标签: c

请参阅以下代码:

char h[256];
    h[0]=NULL;
    if(h!=NULL)
    {
        printf("It doesn't show NULL\n");
    }
    else
    {
        printf("It shows NULL\n");
    }

以及以下内容:

char h[256];
        if(h!=NULL)
        {
            printf("It doesn't show NULL\n");
        }
        else
        {
            printf("It shows NULL\n");
        }

以及以下内容:

 char h[256];
h[0]='\0';
            if(h!=NULL)
            {
                printf("It doesn't show NULL\n");
            }
            else
            {
                printf("It shows NULL\n");
            }

在每种情况下,char* h都没有NULL。为什么会这样?它不是假设有NULL,因为我没有存储任何东西吗?如果不是这样,我怎么能确保它只包含NULL?

5 个答案:

答案 0 :(得分:4)

h[0]h不同。 h[0]是数组中的第一个字符; h是数组本身(在这种情况下会衰减到指针)。

试试这个:

char h[256];
h[0]=NULL;
if(h[0]!=NULL)
{
    printf("It doesn't show NULL\n");
}
else
{
    printf("It shows NULL\n");
}

另请注意,在这种情况下您可能不应该使用NULLNULL是指针;你需要'\0'

答案 1 :(得分:1)

由于您在堆栈上分配char[]数组,因此它不能是NULLh始终指向内存中的有效位置,因此您的支票必须失败。

如果要在没有数据的情况下初始化阵列,则应使用

char h[256] = {'\0'};

'\0'NUL字符,与NULL

不同

答案 2 :(得分:1)

多数民众赞成是因为你的条件是if(h != NULL),这意味着你实际上在比较的h地址肯定不会NULL。如果它是if(*h != NULL),第一和第三种情况肯定会执行else部分。从第二部分开始,它将在h [0]中包含一些垃圾值,所以如果它是0,它将执行else部分。

答案 3 :(得分:1)

定义

char h[256]

表示 h 是一个数组。数组不能是 NULL 。数组是存储器中存储一系列值的区域。

你在某种程度上将 h 指针混淆。

即使它是一个指针,指针的值也不是指向的事物的值。

答案 4 :(得分:1)

而不是

if(h!=NULL)

为什么不使用

if(h[0]!=NULL)

当您将数组的第一个元素初始化为null时,而不是数组本身! 要确保元素为null,请使用

for(i=0; i<h.length ; i++)
 h[i]=NULL;

或使用'\ 0'而不是NULL

至于为什么h不是NULL 尝试打印h 在java中,以下将返回@ .......值,这基本上是变量指向的位置。 (不是空的!)

System.out.println(c);

(自从使用c以来很长时间,所以不知道你是否可以在c中做类似的事情)