关于 malloc(sizeof(struct .)) 和 free() 的疑问解决方案
关于 malloc(sizeof(struct ...)) 和 free() 的疑问下面代码中的注释文字是我不明白地方:C/C++ codetypede
关于 malloc(sizeof(struct ...)) 和 free() 的疑问
下面代码中的注释文字是我不明白地方:
C/C++ codetypedef struct _node{ char name[10]; int age;} *Node;int main(){ char *pStr = malloc(sizeof(char) * 27); char *p2 = pStr; int m; for(m='a';m<='z';m++) { *p2++ = m; } *p2 = '\0'; printf("str:%s\n",pStr); free(pStr); //这一句是否是释放 malloc(sizeof(char) * 27) 所占用的内存 printf("str:%s\n",pStr); Node node = malloc(sizeof(struct _node)*10); int i; for(i=0;i<10;i++) { node[i].age = i * 30; } for(i=0;i<10;i++) { printf("%d: %d\n",i,node[i].age); } free(node); //这一句是否是释放malloc(sizeof(struct _node)*10)所占用的内存 //下面竟然还能正常显示,那上面的free(node) 没用? for(i=0;i<10;i++) { printf("%d: %d\n",i,node[i].age); } return 0;}
[解决办法]是的。malloc和free是C语言中用来管理动态内存的函数。malloc用于申请,free用于释放。
[解决办法]那就是编译器的问题,我的是vs2010。
[解决办法]刚才调试了一下,发现free(pStr)之后,pStr指向的那段内存的前4字节都变成了0,但后面都没动。
free(pStr);
printf("%c", pStr[4]);
可以看到后面的内容。
[解决办法]那个链接说是vc的debug自动帮你清内存了,gcc不给清
[解决办法][解决办法]我是gcc下弄的。
free(pStr); //这一句是否是释放 malloc(sizeof(char) * 27) 所占用的内存
这里确实是释放了那段内存。不过我这里调试的时候发现,free(p)之后,p所指向的那个地址里面的内容(*p),及其后面的3个字节的地址,一共4字节,都变成了0,但再往后,剩下那些内存里面被赋过值的地方,都还保存着。所以用printf("%c", sPtr[x]) x[4~25] 就会显示出来。
而且,free(p)之后,p的值,也就是malloc分配的那段内存的首地址,这个值还保存在p里面,这应该就是野指针了。
free掉了,在正常情况下,这段内存已经不再受程序控制了。但此时p没有改变过,依旧指向那个地址。打印出来空,是因为用了%s,前4个字节都是空,也就打印出空了。
free(node); //这一句是否是释放malloc(sizeof(struct _node)*10)所占用的内存
这里也一样,虽然释放了,但指针没有进行过赋值(node = NULL),而且内存中的数据也没有改动过。这时候继续用那个指针访问,还是可以输出那些内容。