2013-04-10 110 views
0

在一个程序,我发展我有这样的结构:分配内存的指针结构

typedef struct _event { 
    int id; 
    char title[30]; 
    char desc[60]; 
    int state; 
} event; 

在这个节目,我会用谁requieres的指针,这个结构的函数的某一部分。

void event_foo(event *e) 
{ 
/* Something will be done on this function, 
    with certain parameters of the pointer to the struct are needed */ 
} 

但是在访问此函数之前,我要求将内存分配给该指针指向结构体。

int main() 
{ 
    event newevent; 

    /* In some place before invoking the function, 
    memory assignation is required */ 

    event_foo(&newevent); 

    return 0; 
} 

¿有任何建议吗?

回答

2

你做的方式是正确的

你做

event newevent; 

与类型event

分配静态内存newevent声明,当你调用的函数

event_foo(&newevent); 

加入&newevent开头这意味着您所提供的地址(指针)的newevent作为输入自变量的函数

到函数可以修改结构

的参数实施例

void event_foo(event *e) 
{ 
    e->id = 5; 
    strcpy(e->title, "any string"); 
    strcpy(e->desc, "any string2"); 
    e->state = 1; 
} 

而在main()和调用event_foo()后,您可以访问您的数据以这种方式

event_foo(&newevent); 
printf("id = %d\ntitle = %s\ndesc = %s\nstate = %d\n", 
     newevent.id, 
     newevent.title, 
     newevent.desc, 
     newevent.state); 
return 0; 
+0

我已经在程序中实现了这一点。 – SealCuadrado 2013-04-10 16:24:50

+0

@CristianC。所以你想要做什么?这种方式为结构分配内存并处理它是正确的。 – MOHAMED 2013-04-10 16:26:19

+0

也许你的回答是正确的,因为没有指定所需的内存类型。 – SealCuadrado 2013-04-10 17:03:21

3

此:

event newevent; 

创建的event堆栈分配的实例,已提供了它的内存。该内存将有效,直到newevent超出范围。如果event_foo()要读取newevent的任何成员,而不是仅更新它们,则必须在致电event_foo()之前初始化newevent的成员。

如果你宣布一个指向event

newevent = malloc(sizeof(*newevent)); 

在这种情况下,内存为newevent存在:

event* newevent; 

那么这将是必要的newevent分配内存访问其成员之前直到调用free(newevent)

+0

特别是在这种情况下,内存分配需要在调用'event_foo()'之前完成,并且这个想法是在不修改相同函数的参数的情况下完成的。如果我声明指向事件的指针,那么'event_foo()'的参数是否有任何改变? (你命名的第二种情况)。 – SealCuadrado 2013-04-10 17:07:07

+0

无,但调用时不要使用操作符的地址。 – hmjd 2013-04-10 17:19:11

0

如果仅需要e来指向作为参数传递的对象,则不需要为其分配内存。通过指针我们直接访问对象的内存位置,所以我们可以直接对传递的对象的成员做任何更改