读书人

关于 malloc(sizeof(struct .)) 和 fr

发布时间: 2012-05-06 16:15:43 作者: rapoo

关于 malloc(sizeof(struct ...)) 和 free() 的疑问
下面代码中的注释文字是我不明白地方:

C/C++ code
typedef 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。
探讨

引用:
你程序有点小问题 在malloc前面要加那个指针的强制转换。

我用的是codeblocks,编译没有任何警告。

[解决办法]
刚才调试了一下,发现free(pStr)之后,pStr指向的那段内存的前4字节都变成了0,但后面都没动。

free(pStr);
printf("%c", pStr[4]);
可以看到后面的内容。
[解决办法]
那个链接说是vc的debug自动帮你清内存了,gcc不给清


探讨

引用:
操作系统的问题??


我在linux下可以正常显示,,windows不知道。。还没试过

[解决办法]
探讨
引用:
操作系统的问题??


我在linux下可以正常显示,,windows不知道。。还没试过

[解决办法]
我是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),而且内存中的数据也没有改动过。这时候继续用那个指针访问,还是可以输出那些内容。



读书人网 >C语言

热点推荐