gpt4 book ai didi

c - struct c 动态分配内存

转载 作者:行者123 更新时间:2023-12-01 12:49:10 25 4
gpt4 key购买 nike

我正在使用一个结构,我想初始化最多 10 个端口。但是,当程序运行时它可能会少很多,直到运行时我们才知道。但是,这将是最大值。我以前从未做过这样的结构,因为我通常使用 calloc 和 delcare 动态分配,就像这样 *ports 作为值类型。

但是,我无法理解

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

*ports = (struct port_t*) calloc(2, sizeof(*ports)); 

看起来我正在分配一个指针,该指针指向在空闲存储上分配的 2 个端口对象?

我不明白为什么要使用带箭头运算符的点运算符?端口[0]->port_id = 20;printf("port_id: %d\n", ports[0]->port_id);

#include <stdio.h>
#include <stdlib.h>

#define MAX_PORTS 10

struct port_t
{
int port_id;
char name;
} *ports[MAX_PORTS];

int main(void)
{
*ports = (struct port_t*) calloc(2, sizeof(*ports));

ports[0]->port_id = 20;

printf("port_id: %d\n", ports[0]->port_id);

return 0;
}

通常情况下,我在 passed 中所做的是这样的:

struct port_t
{
int port_id;
char name;
} *ports;

ports = (struct port_t*) calloc(2, sizeof(*ports));

然后分配以下任一项。但是,之前的程序员已经声明了我在顶部显示的所有内容,所以我无法更改任何内容。

ports[0].port_id = 10;
ports->port_id = 10;

非常感谢您的任何建议,

最佳答案

你的第一个代码块有

struct port_t
{
int port_id;
char name;
} *ports[MAX_PORTS];

这是一个指针数组。这意味着以后当你使用

ports[0]->port_id

您正在取消引用数组中的第一个指针。您实际调用的对象的大小也有一些丑陋之处。您实际上是用 2 的数组替换 10 的数组。您得到的结果通常很丑陋且容易出错。

我相信您的意图更多是:

struct port_t
{
int port_id;
char name;
} *ports;

int main(void)
{
*ports = (struct port_t*) calloc(2, sizeof(*ports));

ports[0].port_id = 20;

printf("port_id: %d\n", ports[0].port_id);

return 0;
}

由于您使用的是 C99,您可以通过使用 C99 的变量数组声明来避免调用 calloc()/malloc(),如果您确实想要

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

这里的诀窍是因为它在堆栈上,所以它只对那个函数和它调用的任何函数有效。一旦您从该函数返回,它当然会被释放。

关于c - struct c 动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com