2010-10-29 67 views
3

我做了,像這樣的結構:數據結構問題

struct ponto { 
    int x; 
    int y; 
    int z; 
}; 

1)我可以初始化INT與默認值? int var = value;似乎不起作用,編譯器說「之前的語法錯誤='令牌」或類似的東西。

2)我需要像一些結構數組一樣工作,但是在讀取一個文件之後,我只知道在應用程序啓動後需要多少個。我該如何malloc?

在此先感謝

編輯:很多答案,我很感激。可悲的是,我只能標誌着一個

+0

很多答案,你選擇-2投票答案 – 2010-10-31 17:07:30

+0

@fahad:如果我沒有檢查我的問題,每一天的每一天,我很抱歉。如果我當時選擇它,這意味着它可能被大多數人接受,包括我在內。 – Qosmo 2010-11-02 13:36:42

+0

你應該給社會一些時間讓他們回顧一下對你和你來說更好的答案。 – 2010-11-02 14:03:42

回答

2

a)您可以用

initalise
struct pronto p = {1,2,3}; 

在最近的編譯器(不知道如何便攜本是,認爲這是C99?)

b)你可以使用malloc分配數組:

struct pronto *array = malloc(sizeof(struct pronto) * NUMBER); 
+0

如果你沒有投到'struct ponto *',在C中,你可能會從編譯器得到一個警告。在C++中,這根本不會編譯。 – 2010-10-29 15:40:39

+1

來自維基百科:「在ANSI C標準下,演員陣容是多餘的。」 http://en.wikipedia.org/wiki/Malloc – Flexo 2010-10-29 15:45:14

+0

你的回答(一)與C99無關。您將混合初始化與複合文字相混淆。 – 2010-10-29 17:05:06

-3

問題1:如果你需要用一個值來初始化INT:

struct ponto p1; 
p1.x = p1.y = p1.z = 3; // initializing with three 

另外,如果你想將所有值初始化爲0,你可以使用memset這樣的:

memset(&p1, 0, sizeof(struct ponto)); 

問題2:要使用malloc:

struct ponto *ps; 
ps = (struct ponto *)malloc(N*sizeof(struct ponto)); 
// where N is your element count. 

這將人找到內存來存儲N類型的元素struct ponto。在此之後,你可以用它的初始化值:

int initvalue = 3; // assuming you want to initialize points with value 3 
for (i=0; i<N; i++) { 
    ps[i].x = ps[i].y = ps[i].z = initvalue; 
} 
+2

我雖然從虛空鑄造*就像在C被認爲是壞形式? – Flexo 2010-10-29 15:36:37

+0

@awoodland:爲什麼?在C中用'void *'投擲什麼是好方法? – 2010-10-29 15:38:51

+3

你不需要從C++中的void *轉換爲struct pronto *,儘管你會用C++。我可能在這裏是錯誤的,但我認爲不寫(多餘)演員的理由是因爲它沒有對正確的代碼做任何有用的事情,它唯一能做的就是將問題隱藏在不正確的代碼中。 (例如在一些其他的例子中意外拋出const) – Flexo 2010-10-29 15:42:51

0

You'e製成的結構定義,現在你必須創建一個結構的變量之前,您可以設置字段:

struct ponto xyz; 
xyz.x = 7; 

要分配足夠的空間:

int need_to_have = 24; 
struct ponto *pontos = malloc (need_to_have * sizeof(struct ponto)); 
0
  1. 你不能有「默認「結構成員的價值。空間未分配給結構定義。你只是創建一個新的類型(如內置的int)。當你實際定義一個類型爲ponto的變量時,空間將被分配給它。

  2. 您可以對您需要多少人進行有根據的猜測,爲這些人分配空間(使用malloc)然後繼續。如果您發現達到極限,則可以使用realloc函數調整陣列大小。

1

initialize your structure members to 0,做到:

struct ponto foo = { 0 }; 

malloc()合適大小的數組,這樣做:

struct ponto *arr = (struct ponto *) malloc(COUNT * sizeof(struct ponto)); 

不要忘記free()數組時,即可大功告成用它。

+3

+1用於需求使用後釋放陣列。一個人不能說經常就夠了! – Flinsch 2010-10-29 15:39:13

1
struct ponto* create_and_init_ponto(int n) 
{ 
    struct ponto* array; 
    int i; 

    array = (struct ponto*)malloc(n * sizeof(struct ponto)); 

    for (i = 0; i < n; ++i) 
    { 
     array[ i ].x = 0; 
     array[ i ].y = 0; 
     array[ i ].z = 0; 
    } 

    return array; 
} 
0

1)你不能給出一個具體的結構,默認值及其在語言級別的元素,因爲在C中的所有變量是未初始化的,除非你明確地對它們進行初始化(或使它們的靜態/外部在這種情況下,他們零初始化)。如果你設計結構,使得全零是一個很好的初始值組,不過,你總是可以初始化這樣的:

struct foo myfoo = {0}; 

{0}作爲通用零初始化它適用於任何類型。

如果你需要不同的默認值,最好的辦法是使用你的結構必須使用宏使用宏和文檔代碼:

#define FOO_INITIALIZER { 1, 2, 3 } 
struct foo myfoo = FOO_INITIALIZER; 

2)如果你知道你開始使用任何結構的前你將需要多少,只是malloc所有這些,一旦你知道電話號碼:

if (count > SIZE_MAX/sizeof *bar) abort(); 
struct foo *bar = malloc(count * sizeof *bar); 

注意調用malloc,避免溢出漏洞正確的成語。

如果你不知道你需要的數字,直到你開始使用它們,通過分配一個合適的數字開始,如果你用完,增加一個固定的倍數,例如加倍的大小是普遍和容易的。你會想在這裏檢查溢出。然後使用realloc