【问题标题】:Using malloc to create a pointer to multiple struct items使用 malloc 创建指向多个结构项的指针
【发布时间】:2016-10-13 02:00:01
【问题描述】:

对于一个 c 编程类,我被告知使用 typedefs 按顺序创建以下结构:

//STRUCTS
struct time {
    unsigned int hour;
    unsigned int minute;
    unsigned int second;
};//end struct time
struct date {
    unsigned int month;
    unsigned int day;
    unsigned int year;
};//end struct Date
struct event {
    char name[20];
    struct time* time;
    struct date* date;
};//end struct event

//TYPEDEFS
typedef struct time Time;
typedef struct date Date;
typedef struct event Event;

我应该从那里询问要创建的最大事件数,然后为那么多事件分配一个具有足够内存的指针。我的部分工作是:

Event *events;

//Ask for max number of events and allocate memory
printf("Number of events to add: ");
scanf("%d", &numEvents);
events = (Event*) malloc(sizeof(Event) * numEvents);

但是,从那里我不确定如何遍历指针以查看特定事件。我知道它不仅仅是一个数组,所以 events[i] 不起作用。但除此之外,我迷路了。我获取事件的(损坏的)功能是:

void getEvent(Event *events, int index){
    //variables
    char title[20];
    unsigned int day, month, year, hour, minute, second;
    Event tempEvent;


    //Ask for input
    printf("Input title, date, and time.\n");
    if(index == 0)
        printf("example -> title: dd/mm/yy hh:mm:ss\n");

    //Take input
    scanf("%20[^:]: %u/%u/%u %u:%u:%u", title, &day, &month, &year, &hour, &minute, &second);


    tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } };

    events[index] = tempEvent;      
}

我知道这是不对的,我在测试时遇到了分段错误。

当我编译时,我收到这些警告(以及一些关于类似事情的重复):

Lab4.c: In function ‘getEvent’: Lab4.c:82:2: warning: braces around scalar initializer 
tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } }; 
^ Lab4.c:82:2: note: (near initialization for ‘(anonymous).name[1]’)

Lab4.c:82:39: warning: excess elements in scalar initializer 
tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } }

【问题讨论】:

  • events[i] 将完全有效。在 C 中,数组表示法是指针算术的简写,所以 events[i] 等价于 *(events+i)
  • 你从编译器得到什么警告?
  • @JeremyFriesner 如何访问结果字段? events[i]->time->hour 会正常工作吗?
  • @user3386109 Segmentation fault (core dumped) 虽然我试图访问这些项目并打印它们。那可能已经完成了

标签: c pointers struct malloc


【解决方案1】:

编译器告诉你第 82 行是一团糟。

tempEvent = (Event) {*title, { hour, minute, second }, { month, day, year } };

特别是event 结构的第一个成员是数组char name[20],但您尝试使用单个字符*title 对其进行初始化。但更大的问题是timedate(在event 结构中)是指针,而您没有为这些指针分配任何内存。

一种解决方案是分配内存,然后让scanf 填写值,如下所示:

void getEvent( Event *events, int n )
{
    // allocate memory
    events[n].time = malloc(sizeof(Time));
    events[n].date = malloc(sizeof(Date));
    if ( events[n].time == NULL || events[n].date == NULL )
    {   /* TODO: handle the error */ }

    //Ask for input
    printf("Input title, date, and time.\n");
    if ( n == 0 )
        printf("example -> title: dd/mm/yy hh:mm:ss\n");

    //Take input
    int count = scanf( "%20[^:]:%u/%u/%u%u:%u:%u", events[n].name,
                       &events[n].date->day, &events[n].date->month, &events[n].date->year,
                       &events[n].time->hour, &events[n].time->minute, &events[n].time->second );
    if ( count != 7 )
    {   /* TODO: handle the error */ }
}

【讨论】:

  • 我看到你有待办事项:处理错误,但你究竟打算用这些 if 做什么?
  • @13islucky 我把这个留给你做。如果没有剩余内存,您必须决定程序应该做什么(第一个 TODO)。如果用户输入无效(第二个 TODO),您需要决定程序应该做什么。
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2016-07-05
相关资源
最近更新 更多