指向struct的指针数组中的指针(如果设置为NULL)是否会分配内存?

时间:2015-09-04 11:49:40

标签: c arrays pointers struct

我是C的新手,这是我的第一个问题: 对于这个结构:

typedef struct Branch
{
    Tree * thisTree;
    struct Branch  * nodes[];
} Branch;

如果我执行以下操作似乎工作正常:

Branch branch1;
branch1->nodes[0] = NULL;

即使我不以这种方式为数组中的指针nr 0分配内存:

branch->node[0] = (Branch *) malloc(sizeof(Branch *));

如果我查看此代码:

if ( branch1->nodes[0] == NULL)
    printf("is NULL");

它打印到输出:是NULL

所以我的问题是: 是否为指针分配了内存?

branch1->nodes[0]

因为我有很多结构,如果我用固定数量的指针初始化每个分支,我会得到很多分配的数据(如果我用sizeof函数检查)。 这是这样的:设置为NULL(上图)是一种错误的思维方式吗?

我的问题是指针的内存分配是4个字节。所以没有在数组中声明指定数量的指针,它何时为它分配内存? 抱歉 我试图让问题变得简单,但我需要通过下一个分支中的结构指针来获取字符串

这意味着我使用的结构是

typedef struct Branch
{
    Tree * thisTree;
    char *string;
    struct Branch  * nodes[];
} Branch;

所以,如果我不

branch->node[0] = (Branch *) malloc(sizeof(Branch *));

而不是

branch->node[0]->String = strdup("text");

我认为编译错误。

2 个答案:

答案 0 :(得分:0)

没有。空指针不会分配任何内存来存储它,因为没有任何内容可以分配(因此" null")。

您的nodes数组确实会分配内存来存储空指针本身,但是存储整数,浮点数,结构的空指针数组所花费的内存一样多。

答案 1 :(得分:0)

基本上你是在为指针分配内存,并在其中放置值NULL,在C中通常为0.但是该值必须放在已分配的内存中,在这种情况下分配给指针,所以是的,仍然为指针分配内存,你只需将它的值设置为零。

如果你写了branch->node = NULL;,你可能会使指针无效,失去对该内存的访问权限,但这不是删除它的正确方法,因为内存仍然是分配但只是无法访问,而是你应该使用free(branch->node);取消分配内存,以防你想这样做。

关于内存中分配位置的数量,这将由您乘以sizeof()函数的次数来定义:

int number = 2; //assume you want two elements
branch->node[0] = (Branch *) malloc(number*sizeof(Branch *));