在c中使用自己的结构时出错
在“突击队h”中定义在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
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