我正在为操作系统类进行分配。我们给出了用于帮助我们完成任务的代码,但是我对C的编程经验很少,而且我无法弄清楚如何使用它。我要做的是在列表的头部打印信息。该列表是定义为
的结构列表typedef struct
{
char name[NAME_MAX];
int lifetime;
} pcb_t;
int
List_head_info ( List_t *list, void **data )
{
int all_ok = 0;
*data = NULL;
if ((list != NULL) && (list->head != NULL)) {
*data = list->head->data;
all_ok = 1;
}
return all_ok;
}
我尝试用以下方式显示它们:
printf("test: %s", List_head_info(&processes, (void *)pcb)->name);
但编译时我收到错误invalid type argument a->a
。
答案 0 :(得分:1)
当你致电List_head_info()
时,你会得到两件事:
void *
),或NULL。如果成功返回,您可以将void *
转换(强制或强制转换)为pcb_t *
,然后使用它来打印数据。
我具体怎么做?
可能有点像这样:
List_t list;
...code to initialize and maybe add things to the list...
void *head_data = 0;
if (List_head_info(&list, &head_data))
{
pcb_t *item = (pcb_t *)head_data;
printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}
严格地说,head_data
的初始化是多余的; List_head_info()
中的代码始终将值设置为至少一次(为NULL或0),有时为两次(第二次设置为列表中头项的数据组件)。
这是'示例代码',其中包含足够的信息进行编译。我已经'反向设计'列表结构足够有意义;当然,实际的实施会有所不同。它在相当严格的GCC警告级别下完全编译,在Mac OS X 10.7.4上使用GCC 4.1.2和4.7.0。 AFAICS,它避免了一些与“严格别名”相关的复杂问题,在这个阶段你真的不想担心。
#include <stdio.h>
enum { NAME_MAX = 40 };
typedef struct Node Node;
struct Node
{
void *data;
Node *next;
};
typedef struct
{
Node *head;
Node *tail;
} List_t;
typedef struct
{
char name[NAME_MAX];
int lifetime;
} pcb_t;
extern int List_head_info(List_t *list, void **data);
extern void another_func(List_t processes);
void another_func(List_t list)
{
void *head_data = 0;
if (List_head_info(&list, &head_data))
{
pcb_t *item = (pcb_t *)head_data;
printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}
}
int
List_head_info ( List_t *list, void **data )
{
int all_ok = 0;
*data = NULL;
if ((list != NULL) && (list->head != NULL)) {
*data = list->head->data;
all_ok = 1;
}
return all_ok;
}