1

我正在为操作系统课程分配作业。我们得到了代码来帮助我们完成任务,但我对 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编译时出现错误。

4

1 回答 1

1

当你打电话时List_head_info(),你会得到两件事:

  1. void *指向头数据的指针 ( ),或 NULL。
  2. 指示指针是否为非 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;
}
于 2012-05-28T22:21:07.210 回答