2

我正在使用一个结构,我想初始化最多 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;

非常感谢您的任何建议,

4

3 回答 3

7

你的第一个代码块有

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;

诀窍在于,由于它在堆栈上,因此它仅在该函数及其调用的任何函数中有效。一旦你从那个函数返回,它当然会被释放。

于 2009-03-06T18:41:27.217 回答
6
*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。您将第一个指针设置为指向两个端口的足够内存。

对于这么小的事情,制作十个端口但不要全部使用它们会更有意义:

#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;
}
于 2009-03-06T18:50:48.070 回答
2

ports 是指向 port_t 对象的指针数组,因此通过执行 ports[0] 你得到一个指针,而不是一个对象,你需要使用 -> 访问它

在 C 语言中获取关于指针的良好资源并从头到尾阅读它。还有阅读 C 声明的教程。通过获得随机问题的答案,您将无法理解该主题。

是一个值得阅读的链接。

于 2009-03-06T18:45:23.637 回答