[英]struct c dynamically allocate memory
我正在使用一个结构,我想初始化最多 10 个端口。 但是,当程序运行时,它可能会少很多,直到运行时我们才知道。 但是,这将是最大值。 我以前从未做过这样的 struct ,因为我通常使用 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", 端口[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;
}
通常,我在传递中所做的是:
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;
诀窍在于,由于它在堆栈上,因此它仅对 function 和它调用的任何 function 有效。 一旦你从那个 function 返回,它当然会被释放。
*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?
是的,你正在制作一个由十个指针组成的数组
*ports = (struct port_t*) calloc(2, sizeof(*ports));
...但是这条线是胡说八道。 与此相同:
ports[0] = (struct port_t*) calloc(2, sizeof(port_t));
IE。 您将第一个指针设置为指向足够的 memory 用于两个端口。
对于这么小的事情,制作十个端口但不要全部使用它们会更有意义:
#define MAX_PORTS 10
struct port_t
{
int port_id;
char name;
} ports[MAX_PORTS];
/* number of ports in use */
int numPorts = 0;
int main(void)
{
numPorts = 3;
for (int i=0; i<numPorts; i++) {
ports[i].port_id = i;
printf("port_id %d: %d\n", i, ports[i].port_id);
}
return 0;
}
ports 是指向 port_t 对象的指针数组,因此通过执行 ports[0] 你会得到一个指针,而不是 object,你需要使用 -> 访问它
在 C 中获取有关指针的良好资源并从头到尾阅读。 还有阅读 C 声明的教程。 通过获得随机问题的答案,您将无法理解该主题。
这是一个值得阅读的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.