2015-09-04 83 views
1

我是新的C,这是我的第一个问题: 为这种结构:指向struct的指针数组中的指针,如果设置为NULL,是否分配内存?

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"); 

我ge编译器错误。

+0

不要在C. – Olaf

+0

你做投malloc'和朋友的'结果。 C不是Java或Python等。指针不是引用,而是第一类对象。使用valgrind。如果你不这样做,简单的比较甚至可能会奏效,你不能依赖_undefined behaviour_ ** not **来产生正确的结果。 – Olaf

+0

我喜欢那些演员。 –

回答

0

不.Null指针没有分配任何内存来将它存储在堆上,因为没有任何东西需要分配(因此“null”)。

您的节点数组并没有分配内存来存储空指针本身,但是它只需要存储空指针整数,浮点数,结构数组所需的内存就是它的名称。

+0

我的问题是,指针的内存分配是4个字节。所以没有在数组中声明的指针数量,它何时为它分配内存? – BlindWhiteLabMouse

+0

是的,它必须为_pointer本身_分配内存。意味着10个整数,10个结构或10个双精度的数组将分别分配在32位或64位操作系统上分配的40个字节(4个字节* 10)或80个字节(8个字节* 10)。将这些指针设置为null是**不会分配更多或更少的字节。 – Mirza

+0

这就是问题,有多少?因为在结构中我没有指定数组中指针的数量 – BlindWhiteLabMouse

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 *));