当你打电话时List_head_info()
,你会得到两件事:
void *
指向头数据的指针 ( ),或 NULL。
- 指示指针是否为非 NULL 的状态。
如果它成功返回,您可以将其转换(强制或强制转换)void *
为 a 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;
}