struct c动态分配内存

时间:2009-03-06 18:14:21

标签: c struct calloc

我正在使用结构,我想初始化最多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个端口对象的指针?

我无法理解为什么我使用带箭头运算符的点运算符? ports [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;
}
通常,我在传递过程中所做的是:

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;

非常感谢任何建议,

3 个答案:

答案 0 :(得分:7)

您的第一个代码块

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

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

ports[0]->port_id

您正在取消引用数组中的第一个指针。还有一些丑陋的周围你实际上是calloc'ing的大小。你实际上用一个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;

这样的技巧是因为它在堆栈上,它只对该函数及其调用的任何函数有效。一旦你从该功能返回,它当然会被释放。

答案 1 :(得分: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));

即。您正在设置第一个指针指向两个端口的足够内存。

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

#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;
}

答案 2 :(得分:2)

ports是指向port_t对象的指针数组,所以通过执行ports [0],你得到一个指针,而不是一个对象,你需要使用 - &gt;

来访问它

抓住C中指针的好资源,从头到尾阅读。还有关于阅读C声明的教程。通过获取随机问题的答案,您将无法理解这一主题。

Here是值得一读的链接。