2012-05-15 76 views
1

請參見下面的代碼:混淆初始化炭[]

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?

回答

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

由於您在堆棧中分配char[]陣列,因此它不能是NULLh將始終指向內存中的有效位置,因此您的檢查必須失敗。

如果要初始化數組沒有數據,你應該使用

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

'\0'NUL角色是不一樣的NULL

1

那是因爲你的條件是if(h != NULL),這意味着你實際上比較h的地址肯定不會是NULL。如果是if(*h != NULL),第一個和第三個案件肯定會執行else部分。截至第二部分,它將在h [0]處包含一些垃圾值,因此如果它的0偶然,它將執行else部分。

1

定義

char h[256] 

裝置ħ是一個數組。數組不能爲NULL。數組是內存中存儲一​​系列值的區域。

你有點困惑h指針

即使它是一個指針,指針的值與指向的值的值也不相同。

1

而不是

if(h!=NULL) 

你爲什麼不使用

if(h[0]!=NULL) 

當你在初始化數組的第一個元素爲空,而不是數組本身! 爲了確保元素爲null使用

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

,或者使用「\ 0」,而不是NULL

至於爲什麼h不空 嘗試打印^ h 在Java中,以下將返回@ .......值,這基本上是變量指向的位置。 (NOT NULL!)

System.out.println(c); 

(長的時間,因爲用c,所以不知道你是否可以在C做類似的事情)