2012-09-09 164 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]. */