这是一个快速测试C程序,我已经编码,看看结构内存分配是如何工作的......
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int kk;
int zz;
} node;
node ** createNode(){
node** res = (node**) malloc(sizeof(node*)*10);
int i,j;
for(i= 0;i<10;i++){
res[i] = (node*) malloc(sizeof(node)*10);
for(j=0;j<10;j++){
res[i][j].kk=33;
}
}
return res;
}
int main(void) {
node ** g = createNode();
printf("%d",g[0][0].kk);
return 0;
}
该程序打印值“33”。现在这对我来说已经很明显了,但是反思一下,我不明白为什么......
现在我考虑一下,变量g
不应该是node ***
类型吗?
并且print语句看起来像printf("%d",g[0][0]->kk);
?
在第二个版本中,我基本上完成了与原始代码相同的操作,但是我有一个指向节点而不是实际节点的指针。
两者之间的区别在于第一个是静态分配(我认为)而第二个是动态分配的...而且我的createNode()函数中创建的节点值不应该在外部被销毁该职能的范围?
只是有点困惑:我需要有人为我澄清这一点,node**
和node***
答案 0 :(得分:1)
让我们使用更简单的函数来制作样本。例如,我们想要创建一个函数,它将为整数分配内存并分配一些值。该功能与您的功能完全相同。
int* createInt() {
int *res = malloc(sizeof(int));
*res = 5;
return res;
}
此函数创建指针并为int分配动态内存。在此之后,该函数返回内存的地址,其中int ,但res
指针将不存在。顺便看看this answer类似的问题,值得一读。
正如您在main
函数中所理解的那样,您使用
int *myInt = createInt();
因为你想为指针分配一个已分配内存的地址来处理它并且毕竟是免费的。
但你可以这样做
int** createInt() {
static int *res;
res = malloc(sizeof(int));
*res = 5;
return &res;
}
并在main
int **myInt = createInt();
这里你做了与上面相同的事情,但是创建了静态指针,因此它从函数的一次调用到另一次调用时保留。因此,您可以返回此指针的地址。它将指向函数结束后的实际数据。
正如评论中所提到的,我的代码并不安全,因为如果你将这个函数调用两次会导致内存泄漏。你可以做到
int* createSingletonInt() {
static int *res;
if (res != NULL) {
return res;
}
res = malloc(sizeof(int));
*res = 5;
return res;
}
如果你想处理相同的int,这可能很有用。如果您处理的事情更有用,但不是int
:&gt;
我认为它可以应用于您的示例。