当前位置:  开发笔记 > 程序员 > 正文

struct c动态分配内存

如何解决《structc动态分配内存》经验,为你挑选了2个好方法。

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

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

非常感谢任何建议,



1> Ryan Graham..:

你的第一个代码块有

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;

其中的诀窍是,因为它在堆栈上,它只能从该函数和它调用的任何函数中有效.一旦从该功能返回,它当然会被释放.



2> Jimmy J..:
*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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有