2012-09-09 363 views
2
typedef struct 
{ 
int id; 
char* first; 
char* last; 
}* person; 

person* people; 

嗨。 如何使用上述所有全局設置來填充不同「人」的人?我有關於typedef結構指針的問題。 我知道指針就像數組,但我有問題得到這一切...C - 如何操作typedef結構指針?

我想保留上述代碼以及。

編輯1:char首先應該是char *首先。

+6

如果你是「知道,指針與數組類似」,這將是最好清空你的頭腦,扔掉你的書並重新開始更好的一個。 –

+3

我個人不喜歡像'typedef'那樣隱藏指針類型。就你而言,它似乎也是錯誤的。你可以改變這些定義嗎? –

+0

指針和數組雖然相關......並不是一回事。 – Andrew

回答

1

你可以使用類似下面簡單地創建一個person類型的結構數組:

people = malloc (num_person * sizeof(person)); 
for (i = 0; i < num_person; i++) { 
    people[i]->first = malloc (size * sizeof(char)); 
    people[i]->last = malloc (size * sizeof(char)); 
} 

在此之後,你可以填滿每個people struct使用不同的參數。

+0

我不認爲這個答案是正確的,因爲OP的定義是「person」和「people」。 –

+0

這是我的錯誤。它被認爲是一個char *。現在測試上面的代碼。 – AbhishekJoshi

+0

@JonathanLeffler,是的,我只是假設這是一個錯字。 –

0

如果你真的想要的雙重間接引用,我想是這樣的:

people = malloc(sizeof(person)); 
*people = malloc(SOME_NUMBER * sizeof(**people)); 

將分配你所需要的。你會得到一個個人結構出像:

(*people)[INDEX] 

當使用一個特定的人的結構,你需要爲firstlast字符串分配內存,以及:

(*people)[INDEX].first = malloc(STRING_SIZE); 
(*people)[INDEX].last = malloc(STRING_SIZE); 

但僅僅除去瘋狂的雙間接將非常乾淨的東西了,讓一切輕鬆了許多使用和理解:

people = malloc(SOME_NUMBER * sizeof(person)); 
people[INDEX].first = malloc(STRING_SIZE); 
people[INDEX].last = malloc(STRING_SIZE); 
+0

我認爲OP沒有意識到隱含的雙指針。 (也就是說typedef嵌入一個,然後分配創建另一個)。可能想多解釋一下。 –

+0

感謝您的回覆。 @Carl,如果你能解釋一點點,我將非常感謝它!基本上是雙倍與單一。 – AbhishekJoshi

+0

@AbhishekJoshi - 你的'typedef'中有一個'*',這意味着你創建的類型是一個指針類型。然後你聲明瞭一個類型爲'person *'的全局變量,但是因爲'person'已經是一個指針類型了,你最終會得到一個全局變量,它是一個指向你的結構的指針。只要刪除示例的第6行的'*'就可以清理乾淨。 –

2

其醜無比。你真的應該重新定義人不成爲指針。也不要使用匿名結構。

#include <stdio.h> 

typedef struct { 
    int id; 
    char* first; 
    char* last; 
}* person; 

person* people = (person[]){ 
    (person)&(struct {int id;char* first;char* last;}){0,"me","foo"}, 
    (person)&(struct {int id;char* first;char* last;}){0,"you","foo"}, 
    NULL 
}; 

int main(void) { 
    while(*people) { 
     printf("%s %s\n", (*people)->first, (*people)->last); 
     people++; 
    } 
    return 0; 
} 
1

隱藏真實類型的Typedefs是一個壞主意。

2

不要打擾結構類型定義。這是更清楚,如果你使用帶有標籤的結構,然後做你的事:

struct PERSON { 
    int id; 
    char *first; 
    char *last; 
}; 

struct PERSON *people; /* people is a pointer to a struct PERSON. */ 

/* Allocate array of 42 struct PERSONS. */ 
people = malloc (42 * sizeof *people); 

/* Now use people[0] to people[41]. */