none
一段代码 RRS feed

  • 问题

  • 看到一段代码,很惊异,简化如下void chang(char **str)

    {*str = (char *)malloc(10);}

    void main(){char a[10] = {0};chang((char **)&a);}这段代码能执行并且运行,很明显会内存溢出,但是free(a)这种用法无法释放内存。我的理解是它先在栈上声明了a大小为10.然后取到它的首地址,然后在堆上动态分配空间,然后是编译器怎么free不能释放空间呢,这种用法是否错误的,如果可以这样,那要怎样才能释放内存呢。

    2012年6月12日 1:07

答案

全部回复

  • char [] 是一个比较特殊的指针,不允许修改其指向其他地址。所以并没有使得a重新指向了另外的地址,其地址还是指向栈的。

    麻烦把正确答案设为解答。

    2012年6月12日 3:32
    版主
  • 这种用法是否正确呢,地址还是栈上面,但是又在这个地址上new空间。如果这种用法正确,要怎么释放内存空间呢
    2012年6月12日 7:08
  • 你好,

    这种用法是正确的。正如SplendourG所说的一样,这中方法是把数据存放在栈中,这样的会使得指针a的释放发生在整个程序结束,而不需要我们手动free,而当我们用这种方法:char *a;时free(a);是需要的。具体可以参考:http://blog.csdn.net/hairetz/article/details/4141043(堆和栈),http://stackoverflow.com/questions/419022/char-x256-vs-char-malloc256sizeofchar

    希望对你有帮助。

    此致


    If your question has been solved, please mark the answers and close the post. If not, please feel free to post your questions. With regards.

    2012年6月13日 7:01
    版主
  • char a[10] 是常数指针,程序如果会崩溃的话,不是内存溢出,而是读写禁止访问的区域

    0xBAADF00D

    2012年6月14日 1:47
    版主
  • 您好,谢谢您的答复,但是我malloc监视内存大小的时候,发现内存一直增加,内存并没有自己释放掉
    2012年6月15日 1:17
  • 您好,谢谢您的答复,但是我malloc监视内存大小的时候,发现内存一直增加,内存并没有自己释放掉
    如果程序一直运行,肯定会耗尽内存从而导致程序不稳定的啊,这是我vs2008经过调试检测的。是不是我哪个地方错了
    2012年6月15日 1:24
  • 你通过什么监视内存大小?你想问什么?这个内存增加不一定是你这个函数引起的,你有没有运行别的工程,可能是其他方面引起的这很难说。

    2012年6月19日 1:31
  • 你好,

    鉴于你的第二个问题已经在论坛开设新帖,所以我把这个帖子Mark了,希望您提问有新问题的同时,把老问题正确的答案标记为答案。

    谢谢您的理解。

    此致


    Elegentin Xie [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月22日 6:11
    版主