2011-11-03 118 views
3

我有一個指向struct的指針數組,並且出於任何原因,當我打印此數組時,其末尾有一個備用元素,從而導致代碼在最後打印一個NULL字節。如何在C中將結構指針設置爲NULL?

反正我有可以刪除最後的存儲塊?

例如:

typedef struct 
{ 
    char *name; 
} B; 

typedef struct 
{ 
    B *var; 
} A; 

int main() { 
    int num = 5; //for example 
    A *foo = malloc(sizeof(A)); 
    B *bar = malloc(num * sizeof(B)); 
    for (int i = 0; i < num; i++) { 
     bar[i] = *create_b(&bar[i]); // some function that works. 
    } 
    foo->var = bar; 
    while (foo->var != NULL) { 
     printf("This is %s\n",foo->var->name); 
      foo->var++; 
    } 
} 

一切都被打印出來就好了,但有在循環結束不必要的打印。例如:

This is A 
This is B 
This is C 
This is D 
This is F 
This is 

顯然該數組只有5個元素,最後一個不打印任何東西。

+0

檢查數組是否爲null,如果它是char數組作爲struct的成員。它不應該打印它。除非您向我們展示代碼實際上正在嘗試,否則很難弄清楚。 – Mahesh

+0

你初始化了數組中的數據嗎? – ziu

+0

你能向我們展示一個有關代碼的例子嗎?就像你如何定義數組,結構以及如何打印數組一樣? –

回答

3

您的打印循環是:

foo->var = bar; 
while (foo->var != NULL) { 
    printf("This is %s\n",foo->var->name); 
    foo->var++; 
} 

foo->var永遠等於NULL,因爲你只是遞增指針,所以你最終會讀過去bar陣列的結束和你的應用程序可能會崩潰。

如果將while循環替換爲for (int i = 0; i < num; i++),它將打印正確數量的元素。

+0

這就是我要找的:)謝謝你的答案。 – antiopengl

-1

你的問題可能是在功能create_b,你沒有張貼。

編輯:不,這可能是錯誤的,對不起。

但可以肯定這是不是你想要的:

bar[i] = *create_b(&bar[i]); 

你們都在通欄的地址[i]和將其設置爲任何的返回值點?

+0

它只設置'bar'的名字,打印出來就像你看到的那樣。但循環只能從0到num? – antiopengl

+0

是的,我看到這不太對 - 看我的編輯? – usul

1

你不能這樣做foo->var++,因爲它被設置爲NULL數組中沒有的地方。此外,使用該++更改foo->var所以在循環foo->var不再指向數組的開始之後,並且您不能再次訪問該數組。

您需要爲結束陣列一些標記分配內存,就像琴絃有字符\0來標記字符串的結束。

嘗試以下操作:

int main() { 
    int num = 5; //for example 
    A *foo = malloc(sizeof(A)); 
    B *bar = malloc((num + 1) * sizeof(B)); // +1 for array terminator 
    for (int i = 0; i < num; i++) { 
     bar[i] = *create_b(&bar[i]); // some function that works. 
    } 
    bar[i].name = NULL; // Use this as a marker to mean end of array 
    foo->var = bar; 
    for (B *tmp = foo->var; tmp->name != NULL; tmp++) { 
     printf("This is %s\n",tmp->name); 
    } 
} 

編輯在代碼中有一些錯誤。