0

在我正在开发的程序中,我有这样的结构:

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

在这个程序的某个部分,我将使用一个需要指向该结构的指针的函数。

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;
}

¿ 有什么建议吗?

4

3 回答 3

3

这个:

event newevent;

创建 的堆栈分配实例event,并为其提供内存。此内存将一直有效,直到newevent超出范围。如果event_foo()要读取 的任何成员newevent而不仅仅是更新它们,那么您必须newevent在调用 之前初始化 的成员event_foo()

如果您声明了一个指向event

event* newevent;

那么有必要newevent在访问其成员之前为其分配内存:

newevent = malloc(sizeof(*newevent));

在这种情况下,内存的newevent存在直到free(newevent)被调用。

于 2013-04-10T16:19:24.517 回答
2

你的做法是对的

你所做的声明

event newevent;

正在为neweventwith 类型分配静态内存event

当你调用函数时

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;
于 2013-04-10T16:17:43.070 回答
0

如果只需要 e 指向作为参数传递的对象,则无需为其分配内存。通过指针,我们直接访问对象的内存位置,因此我们可以直接对传递的对象的成员进行任何更改

于 2013-04-10T16:21:09.900 回答