我是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 回答
否 . 空指针不分配任何内存来将其存储在堆上,因为没有要分配的内容(因此“null”) .
您的nodes数组确实会分配内存来存储空指针本身,但是存储整数,浮点数,结构的空指针数组所花费的内存量就是这么多 .
基本上你是在为指针分配内存,并将值
NULL
放在那里,在C中通常是0.但是值必须放在已分配的内存中,在这种情况下分配给指针,所以是的,仍然分配内存到指针,你只需将它的值设置为零 .但是如果你写了
branch->node = NULL;
,你就会使指针无效,失去对该内存的访问权限,但这不是删除它的正确方法,因为内存仍然是分配但只是无法访问,而是应该使用free(branch->node);
取消分配记忆,如果你想这样做 .关于内存中已分配位置的数量,这将由您乘以
sizeof()
函数的时间来定义: