我有一个家庭作业,在其中我需要将内存分配给指向指针数组的指针(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是一个类似于我的问题,但它并没有真正帮助我
谢谢!
答案 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();
}