使用 struct 通过指针操作 structs 参数值?

Using a struct to manipulate a structs parameter value via a pointer?

提问人:Matteo G 提问时间:10/31/2023 最后编辑:Fe2O3Matteo G 更新时间:10/31/2023 访问量:59

问:

我目前正在尝试开发一个流程创建程序,并希望获得一些见解。我想创建一个 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;

是我做错了什么,还是这是不可能的?

C 指针 结构

评论

3赞 Jonathan Leffler 10/31/2023
至少,应该读取 typedef struct vs struct definitions?我认为这很可能是这种情况的重复。
0赞 Fe2O3 10/31/2023
OT:找麻烦?用代替...至少一个 NULL 指针会给出一致的问题(而不是程序似乎在偶数日工作,但只在下午工作......calloc()malloc()

答:

3赞 Cem Polat 10/31/2023 #1

只需将流程结构定义更新为

typedef struct Process {
    int numChildren;
    struct Process* parent;
} Process;

评论

0赞 Jonathan Leffler 10/31/2023
严格来说,问题中的代码中没有定义。有一个带有 typedef 名称的匿名者,但这与 无关。您的修复是正确的 — 添加标记,以便在定义元素时就知道该标记。您只能使用指向类型的指针,就像代码一样;在这一点上,它仍然是一个不完整的类型,直到达到近支撑才完成。struct ProcessstructProcessstruct Processstruct Processparent
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;

在原始代码中,匿名结构被类型化为 ,但从来没有我们可以指定指针指向的结构。Processstruct Process

我们还可以将 typedef 删除到结构定义之前的单独语句中。

typedef struct Process Process;

struct Process {
    int numChildren;
    Process *parent;
};