在'commando.h'中定义

typedef struct {
    int pid;        /* Prozess ID */
    char* name;     /* Prozess Name (Programm) */
    char* status;   /* Status des Programms */
    int check;      /* bereits abgerufen? 1 - abgerufen, 0 - nicht abgerufen */
} Pstatus;

Pstatus erzeugeProzess (int neuID, char* neuName, char* neuStatus);




在'commando.c'中使用

Pstatus erzeugeProzess (int neuID, char* neuName, char* neuStatus){
    Pstatus erzeuge = reserviere(sizeof(struct Pstatus));

    erzeuge->pid = neuID;
    erzeuge->name = neuName;
    erzeuge->status = neuStatus;
    erzeuge->check = 0;

    return erzeuge;
}


编译时会说:这是未完成类型的无效用法
以及erzeuge-> pid ... erzeuge-> check的无效参数类型
不知道是什么问题

谁能解释我做错了什么?

最佳答案

first, the definition of the struct as you defined it is deprecated.
Especially using the keyword 'typedef'
which is effectively unavailable in C++, (amongst other reasons).
A much better definition of the struct is:

struct Pstatus
{
    int pid;        /* Prozess ID */
    char* name;     /* Prozess Name (Programm) */
    char* status;   /* Status des Programms */
    int check;      /* bereits abgerufen? 1 - abgerufen, 0 - nicht abgerufen */
};

then your code must reference the struct as 'struct Pstatus'.

then your code would be:
The prototype:

struct Pstatus* erzeugeProzess (int neuID, char* neuName, char* neuStatus);

The declaration:

struct Pstatus* erzeugeProzess (int neuID, char* neuName, char* neuStatus)
{
    Pstatus* erzeuge = reserviere(sizeof(struct Pstatus));

    if( NULL != erzeuge )
    {

        erzeuge->pid = neuID;
        erzeuge->name = neuName;
        erzeuge->status = neuStatus;
        erzeuge->check = 0;
    }
    else
    {
        perror( "reserviere, %s", strerror(errno) );
    }
    return( erzeuge );
}

Regarding an earlier comment.
Although the stack parameters go away, by that time, the pointer to the reserved area
is already passed back to the caller.


By using a pointer in the function prototype and declaration, only a pointer
needs to be passed back, not the whole structure memory.
Also, be sure the caller checks for a NULL return value.
Also, be sure the caller performs something like free(...) to avoid a memory leak

关于c - C中自己的结构错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24166806/

10-12 01:27