内存分配没有"持有"回到主要时

时间:2014-11-21 09:38:09

标签: c arrays pointers void-pointers

我有一个家庭作业,在其中我需要将内存分配给指向指针数组的指针(pNode **)。 下面的函数接收一个指针数组的数组,并为它分配内存和所有相关的指针&里面的数据。

简而言之,该函数应为指向Node指针数组的指针分配内存。

**注意:我已从功能中删除了与我的问题无关的某些元素。 函数newGNode为Node结构

分配内存
int getChildren(pNode** childrenNodes)
{
    *childrenNodes = (pNode*)malloc(sizeof(pNode));
    for (int i = 0; i < NUM_OF_CHILDREN; i++)
    {
        childrenNodes[i] = (pNode *)newGNode();
    }
    return numOfChildren;
}

这就是我在main函数中调用它的方式:

int main()
{
    pNode * ng = NULL;
    int test = getChildren(&ng);

}

无论我尝试做什么,我似乎都无法在主要功能中获得分配“棒”。在getChildren函数中,我可以在调试器中看到内存已经按照我想要的方式精确分配。但是当函数返回main时,ng指针似乎已损坏,因为调试器告诉我它无法读取内存。

我在网上搜索并尝试了不同的东西,但似乎都没有用。有没有人知道为什么这不按预期工作?我猜测内存分配中的内容是错误的,但似乎无法弄清楚是什么。

Here是一个类似于我的问题,但它并没有真正帮助我

谢谢!

3 个答案:

答案 0 :(得分:3)

1)你用两个参数调用getChildren(),但它只期望一个:

int getChildren(pNode** childrenNodes)

2)你想要一个数组但为单个pNode预留空间:

*childrenNodes = (pNode*)malloc(sizeof(pNode));

更改为

*childrenNodes = malloc(sizeof(pNode) * NUM_OF_CHILDREN); /* Don't cast malloc */

修改

似乎你想要一个指针数组,然后必须将ng声明为:

pNode **ng = NULL; /* pointer to pointer */

您需要3个级别的间接接收ng

int getChildren(pNode ***childrenNodes)

并为指针数组保留空间:

*childrenNodes = malloc(sizeof(pNode *) * NUM_OF_CHILDREN);

int的示例:

#include <stdio.h>
#include <stdlib.h>

int arr[] = {1, 2};

void func(int ***p)
{
    *p = malloc(sizeof(int *) * 2);
    (*p)[0] = &arr[0];
    (*p)[1] = &arr[1];
}

int main(void)
{
    int **p;

    func(&p);
    printf("%d %d\n", *p[0], *p[1]);
    free(p);
    return 0;
}

但是***被认为是不好的风格,而是:

#include <stdio.h>
#include <stdlib.h>

int arr[] = {1, 2};

int **func(void)
{
    int **p;

    p = malloc(sizeof(int *) * 2);
    p[0] = &arr[0];
    p[1] = &arr[1];
    return p;
}

int main(void)
{
    int **p = func();

    printf("%d %d\n", *p[0], *p[1]);
    free(p);
    return 0;
}

答案 1 :(得分:0)

我希望其他asnwers解决你的问题,但如果你不介意有另一种方法,[不使用双指针],请考虑以下代码。我相信它是自我解释的。

#include <stdio.h>
#include <stdlib.h>

int * alloc_memory()
{
    int * pTempInt = NULL;

    pTempInt = calloc (1, sizeof(*pTempInt));  //you can replace 1 with desired number
    printf("in alloc_memory, before alloc pInt = %p\n", pTempInt);

    return pTempInt;

}


int main()
{

    int * pInt = NULL;

    printf("in main, before alloc pInt = %p\n", pInt);
    pInt = alloc_memory();
    printf("in main, after alloc pInt = %p\n", pInt);

    free(pInt);

    return 0;
}

答案 2 :(得分:0)

//you could attack the problem directly with:
// where 'Node' is the struct tag name, 
// not a pointer to struct definition 
// and not and struct definition name 
// and not a typedef of a struct

// note:
// gdb prefers struct tag names as then it can display 
// each of the associated fields of the struct.

// also struct { ... } name; is a depreciated format in modern C

struct Node
{
    ...
};

struct Node ** getChildren( void );

struct Node ** getChildren()
{
    // get array of pointers to nodes
    struct Node ** ppChildNodes = malloc( sizeof(struct Node*)*NUM_OF_CHILDREN);

    // get struct Node size allocation for each child pointer
    for( int i=0; i< NUM_OF_CHILDREN; i++)
    {
        ppChildNodes[i] = malloc( sizeof(struct Node) );
    }
    return ppChildNodes;
}


int main()
{
    struct Node ** ng = getChildren();

}