2012-03-14 69 views
4

此代碼:陣列結構的指針,無效的初始化錯誤的,在C

extern void *malloc(unsigned int); 
struct Box { 
    int x, y ,w, h; 
}; 

struct Wall { 
    char color[15]; 
    struct Box *boxes[20]; 
}; 

int main(int argc, const char *argv[]) 
{ 
    struct Wall *mywall = malloc(sizeof(struct Wall)); 
    struct Box *myboxes[] = mywall->boxes; 
    return 0; 
} 

讓我在14行什麼,我試圖做invalid initializer錯誤,是讓結構指針數組的副本,它們在不同的結構中。

+1

無法複製或C.(不過,你可以用它們成一個結構,它可以* *分配。) – 2012-03-14 19:02:20

+4

爲什麼不'#包括'而不是'的extern無效* malloc的分配陣列(unsigned int); '? – glglgl 2012-03-14 19:03:28

+1

@glglgl沒有特別的理由。我寫了這段代碼只是爲了證明我的觀點。我忘記了malloc在哪裏,並且懶得找它。 – yasar 2012-03-14 19:06:07

回答

5

ouch;這裏有一些問題。

extern void *malloc(unsigned int); 

不要這樣做;請使用#include <stdlib.h>,因爲這樣會正確,並且您寫的內容通常不正確(對於malloc()的參數是size_t,它不一定是unsigned int;它可能是unsigned long或某種其他類型)。

struct Box { 
    int x, y ,w, h; 
}; 

除了不穩定的空間,struct Box是確定的。

struct Wall { 
    char color[15]; 
    struct Box *boxes[20]; 
}; 

struct Wall也可以。

int main(int argc, const char *argv[]) 

您沒有使用argcargv,所以你最好使用的備選宣言是:

int main(void) 
再次

原始代碼:

{ 
    struct Wall *mywall = malloc(sizeof(struct Wall)); 

這種分配,但確實不初始化一個struct Wall。它本身沒什麼問題,但在使用之前應檢查分配是否成功。您還需要擔心分配數組元素將指向的struct Box項。

struct Box *myboxes[] = mywall->boxes; 

你在這裏有一個小小的災難。你不能像這樣複製數組。你還沒有檢查你有沒有數組。忽略錯誤檢查,你被卡住之一:

struct Box *myboxes[] = { &mywall->boxes[0], &mywall->boxes[1], ... }; 

或:

struct Box **myboxes = &mywall->boxes; 

我不相信你會希望第二個版本,它所有的短。

return 0; 

我喜歡看return 0;main()末,即使C99可以讓你忽略它。

} 
+0

+1努力!特別是逐行解釋。 – 2012-03-14 19:16:01

0

如何:

struct Box **myboxes = mywall->boxes; 

然後,你可以做的東西,如:

for (int i = 0 ; i < 15 ; i++) 
    mywall->boxes[i] = malloc(sizeof(Box)); 
Box* x = myboxes[1]; 

由於代碼現在,mywall->boxes未初始化。

注:只需重新讀取問題 - 這不會返回數組的副本,但指向相同的位置。如果沒有使用memcpy或只是複製結構,沒有簡短的解決方案。

+0

@KerrekSB我的壞,修復。 – 2012-03-14 19:08:31

+0

謝謝,這個工程。 – yasar 2012-03-14 19:10:34