我做了,像這樣的結構:數據結構問題
struct ponto {
int x;
int y;
int z;
};
1)我可以初始化INT與默認值? int var = value;似乎不起作用,編譯器說「之前的語法錯誤='令牌」或類似的東西。
2)我需要像一些結構數組一樣工作,但是在讀取一個文件之後,我只知道在應用程序啓動後需要多少個。我該如何malloc?
在此先感謝
編輯:很多答案,我很感激。可悲的是,我只能標誌着一個
我做了,像這樣的結構:數據結構問題
struct ponto {
int x;
int y;
int z;
};
1)我可以初始化INT與默認值? int var = value;似乎不起作用,編譯器說「之前的語法錯誤='令牌」或類似的東西。
2)我需要像一些結構數組一樣工作,但是在讀取一個文件之後,我只知道在應用程序啓動後需要多少個。我該如何malloc?
在此先感謝
編輯:很多答案,我很感激。可悲的是,我只能標誌着一個
a)您可以用
initalisestruct pronto p = {1,2,3};
在最近的編譯器(不知道如何便攜本是,認爲這是C99?)
b)你可以使用malloc分配數組:
struct pronto *array = malloc(sizeof(struct pronto) * NUMBER);
如果你沒有投到'struct ponto *',在C中,你可能會從編譯器得到一個警告。在C++中,這根本不會編譯。 – 2010-10-29 15:40:39
來自維基百科:「在ANSI C標準下,演員陣容是多餘的。」 http://en.wikipedia.org/wiki/Malloc – Flexo 2010-10-29 15:45:14
你的回答(一)與C99無關。您將混合初始化與複合文字相混淆。 – 2010-10-29 17:05:06
問題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;
}
You'e製成的結構定義,現在你必須創建一個結構的變量之前,您可以設置字段:
struct ponto xyz;
xyz.x = 7;
要分配足夠的空間:
int need_to_have = 24;
struct ponto *pontos = malloc (need_to_have * sizeof(struct ponto));
要initialize your structure members to 0,做到:
struct ponto foo = { 0 };
要malloc()
合適大小的數組,這樣做:
struct ponto *arr = (struct ponto *) malloc(COUNT * sizeof(struct ponto));
不要忘記free()
數組時,即可大功告成用它。
+1用於需求使用後釋放陣列。一個人不能說經常就夠了! – Flinsch 2010-10-29 15:39:13
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;
}
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
。
很多答案,你選擇-2投票答案 – 2010-10-31 17:07:30
@fahad:如果我沒有檢查我的問題,每一天的每一天,我很抱歉。如果我當時選擇它,這意味着它可能被大多數人接受,包括我在內。 – Qosmo 2010-11-02 13:36:42
你應該給社會一些時間讓他們回顧一下對你和你來說更好的答案。 – 2010-11-02 14:03:42