提问人:Matteo G 提问时间:10/31/2023 最后编辑:Fe2O3Matteo G 更新时间:10/31/2023 访问量:59
使用 struct 通过指针操作 structs 参数值?
Using a struct to manipulate a structs parameter value via a pointer?
问:
我目前正在尝试开发一个流程创建程序,并希望获得一些见解。我想创建一个 Process 指针数组,并使用一个进程来操作另一个进程的值。我简化了此示例的 Process 结构。在本例中,arrayP[1] 是 arrayP[0] 的子项,我希望使用 arrayP[1] 的指针将 arrayP[0] 的子项数的值更改为 1。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MIN_PID 300
#define MAX_PID 5000
typedef struct {
int numChildren;
struct Process* parent;
} Process;
int main(void)
{
Process *arrayP;
arrayP=malloc(sizeof(Process)*2);
arrayP[1].parent=&arrayP[0];
arrayP[1].parent->numChildren = 1;
free(arrayP);
return 0;
}
编译时,出现错误:
incomplete definition of type 'struct Process'
p2.parent->numChildren = 1;
是我做错了什么,还是这是不可能的?
答:
3赞
Cem Polat
10/31/2023
#1
只需将流程结构定义更新为
typedef struct Process {
int numChildren;
struct Process* parent;
} Process;
评论
0赞
Jonathan Leffler
10/31/2023
严格来说,问题中的代码中没有定义。有一个带有 typedef 名称的匿名者,但这与 无关。您的修复是正确的 — 添加标记,以便在定义元素时就知道该标记。您只能使用指向类型的指针,就像代码一样;在这一点上,它仍然是一个不完整的类型,直到达到近支撑才完成。struct Process
struct
Process
struct Process
struct Process
parent
0赞
Cem Polat
10/31/2023
好的,我编辑了答案以删除答案描述中令人困惑的部分。
3赞
Chris
10/31/2023
#2
编译代码时出现以下警告:
$ gcc -Wall -Wextra test.c
test.c: In function ‘main’:
test.c:19:21: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
arrayP[1].parent=&arrayP[0];
^
test.c:20:21: error: dereferencing pointer to incomplete type ‘struct Process’
arrayP[1].parent->numChildren = 1;
^~
但是,如果我们修复您的结构定义,它会干净地编译。
typedef struct Process {
int numChildren;
struct Process* parent;
} Process;
在原始代码中,匿名结构被类型化为 ,但从来没有我们可以指定指针指向的结构。Process
struct Process
我们还可以将 typedef 删除到结构定义之前的单独语句中。
typedef struct Process Process;
struct Process {
int numChildren;
Process *parent;
};
评论
应该读取 typedef struct
vsstruct
definitions?我认为这很可能是这种情况的重复。calloc()
malloc()