Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中使用自己的结构时出错_C_Struct_Sizeof - Fatal编程技术网

在c中使用自己的结构时出错

在c中使用自己的结构时出错,c,struct,sizeof,C,Struct,Sizeof,在“突击队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 */ } Pstatu

在“突击队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);

用于“突击队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的参数类型无效。。。埃尔泽格->检查 不知道是什么问题


有人能解释我做错了什么吗?

有几件事。第一:您正在为指针分配空间,即使您没有声明指针。您想改用
Pstatus*erzeuge
。第二,您已经
typedef
ed了您的结构;您不再需要使用
struct Pstatus
来引用它。您需要
sizeof(Pstatus)
。简而言之,将第一行更改为:

Pstatus *erzeuge = malloc(sizeof(Pstatus));
你的代码也能用。这里还有一个ideone示例:

此外,返回语句应为:

return *erzeuge;
另一种选择是完全放弃指针(看起来这是你无论如何都应该做的):


erzeugeprodes
中,您将
erzeuge
声明为
Pstatus
结构,然后使用
->
访问其用于指针的成员。您应该只使用
erzeuge.pid
notation您的第一个提案引入了内存泄漏。从函数返回后,对分配给<代码> ErZueGe/Cuth>的引用丢失了。问题是C,不是C++!
Pstatus erzeuge;

erzeuge.pid = neuID;
erzeuge.name = ...;
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