如何在C语言中初始化一个指向结构体的指针?

32

给定以下结构体:

struct PipeShm
{
    int init;
    int flag;
    sem_t *mutex;
    char * ptr1;
    char * ptr2;
    int status1;
    int status2;
    int semaphoreFlag;

};

那很好用:

static struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

但是当我声明 static struct PipeShm * myPipe 时,它不起作用,我假设我需要使用运算符->进行初始化,但如何操作?

static struct PipeShm * myPipe = {.init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

是否可以声明一个指向结构体的指针并对其进行初始化?


3
您需要为指针分配内存,以便可以对其进行有意义的操作。单独的指针只是指向一个随机地址。您需要确保指针指向的地址足够大,可容纳结构体内容。 - Alok Save
我不明白... 你为什么需要一个指针 - Karoly Horvath
请点击此处查看问题。为了声明一个指针,您需要分配内存,因此您基本上正在询问相同的事情。 - rudolph9
7个回答

59

你可以这样做:

static struct PipeShm * myPipe = &(struct PipeShm) {
    .init = 0,
    /* ... */
};

这个功能称为“复合字面量”,由于您已经在使用C99指定初始化程序,所以它应该适用于您。


关于复合字面量的存储:

6.5.2.5-5

如果复合字面量发生在函数体之外,则该对象具有静态存储期;否则,它具有与封闭块相关联的自动存储期。


+1. 我不知道这个。在这种情况下,内存从哪里来? - Jay
2
@Jay 该对象的存储空间是静态的(如果复合字面量出现在文件作用域),或者是自动的(如果复合字面量出现在块作用域),并且存储持续时间与其直接封闭块相关联 - cnicutar
@cnicutar:非常好的回答+1并被选中。 - JAN
如果在语句块中定义了结构体指针,我们就不需要释放它,对吧? - NewBee

5
可以声明一个指向结构体的指针并使用初始化吗?
可以。
const static struct PipeShm PIPE_DEFAULT = {.init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
        .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };

static struct PipeShm * const myPipe = malloc(sizeof(struct PipeShm));
*myPipe = PIPE_DEFAULT;

这个程序使用了动态内存分配,因此不太优雅。 - Matthias Dieter Wallnöfer

4
好的,我明白了:
static struct PipeShm  myPipeSt = {.init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
        .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };

static struct PipeShm  * myPipe = &myPipeSt;

2

首先,您需要为指针分配内存,如下所示:

myPipe = malloc(sizeof(struct PipeShm));

然后,您需要逐一分配以下值:

myPipe->init = 0;
myPipe->flag = FALSE;
....

请注意,对于结构体内的每个指针,您需要单独分配内存。

1

首先初始化结构体(static struct PipeShm myPipe = {...)。然后获取地址。

struct PipeShm * pMyPipe = &myPipe;

1
static struct PipeShm * myPipe = &(struct PipeShm) {.init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

在填充结构体之前,您需要对其进行转换。 - user20787710
2
考虑为您的代码添加解释,这样对于原帖作者和未来的读者更有帮助。 - mousetail

0
你需要手动构建该结构体,然后创建指针指向它。
也可以...
static struct PipeShm myPipe ={};
static struct PipeShm *pmyPipe = &myPipe;

或者

static struct PipeShm *myPipe = malloc();
myPipe->field = value;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接