2017-01-11 50 views
1

我想實現C中的線索我的代碼編譯正確,但是當我運行它的valgrind它顯示了一個錯誤。這裏是問題的一部分:如何設置所有的孩子爲NULL線索

typedef struct node { 
bool end; 
struct node *chil[26]; 
} NODE; 
int main() 
{ 
    NODE* ne = (NODE*)malloc(sizeof(NODE)); 
    if(ne->chil[1] == NULL) printf("\nzwycięstwo!\n"); 
    free(ne); 
    return 0; 
} 

,這裏是錯誤報告:

== == 3346條件跳轉或移動依賴於未初始化的值(一個或多個)

== 3346 = =上0x40076B:主(exp.c:21)

== 3346 ==未初始化值是由一個堆分配

== 3346 ==一個創建噸0x4C2AB80:malloc的(在/usr/lib/valgrind/vgpreload_memcheck-amd64->linux.so)

== 3346 ==由0x40075A:主(exp.c:20)`

我想我必須明確地說,

ne->chill = {NULL}; 

但這會導致編譯器錯誤 「預期的表達」

我該怎麼辦?我可以避免通過整個數組將指針設置爲NULL嗎?

+1

首先你應該檢查'ne'本身。其次,你不應該讀未初始化的對象。 「我可以避免通過整個數組來設置指針爲NULL嗎?」 - 不要使用它們的值。但僅僅遵循C約定會更容易。 – Olaf

回答

2

環路是可移植設置所有的指針爲NULL值

for (int i = 0; i < 26; ++i) 
    ne->chil[i] = NULL; 

您可能會聽到建議使用callocmemset的唯一途徑。但是零位模式不一定與指針的NULL值相同。即使許多平臺以這種方式實施。

+0

'memset(...,NULL);'不工作? – Stargateur

+0

@Stargateur:一個聰明的編譯器可能會將此轉換爲反正'memset'(或高度優化的內聯變體),彷彿體系結構採用了空指針的所有位歸零表示他應該知道。將實施細節留給工具鏈(除非你確實認爲這是一個問題)。 – Olaf

相關問題