转载地址:http://www.cnblogs.com/yyxr/archive/2009/09/06/1561197.html

。。。让我们先看一段程序:

#include <stdio.h>
#include <stdlib.h>
#include <string>

void f(char *p)
{
    p = new char[100];
    strcpy(p, "Hello");
    strcat(p, "World!");
}

int main(void)
{
    char *s = NULL;
    f(s);
    printf("%s\n", s);
    delete []s;
    return 0;
}

以上程序的初衷是利用函数f()分配空间并初始化为"HelloWorld"。这句printf("%s\n", s);会输出什么呢?
(null)
这是在我机子上的输出。难道空间没有分配成功?为了验证,我又修改程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string>

void f(char *p)
{
    p = new char[100];
    strcpy(p, "Hello");
    strcat(p, "World!");
}

int main(void)
{
    char *s = NULL;
    f(s);
    printf("%d\n", s);    //打印出指针地址
    printf("%s\n", s);
    delete []s;
    return 0;
}

结果输出:
0
(null)
说明的确没有分配成功。那又是什么原因呢?莫非函数f()中的这句p = new char[100];执行后没有分配空间吗?

我又修改程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string>

void f(char *p)
{
    printf("%d\n", p);    //打印出指针地址
    p = new char[100];    //问题出现在这里,new之后,p指向另一块内存,但是a并不改变
    printf("%d\n", p);    //打印出指针地址
    strcpy(p, "Hello");
    strcat(p, "World!");
    printf("%s\n", p);
}

int main(void)
{
    char *s = NULL;
    f(s);
    printf("%d\n", s);    //打印出指针地址
    printf("%s\n", s);
    delete []s;
    return 0;
}

输出为:

0
9965312
HelloWorld!
0
(null)
Press any key to continue
第一个0说明传入函数是指针地址为NULL,9965312和HelloWorld!则说明在函数f()中成功的给形参p分配了空间并初始化了。第2个0说明调用函数f()后的确没有给s分配空间。
综上所述,我得出的结论是:当函数参数为指针时,在函数中修改该指针所指向的地址(如上面得p)实际上只是修改了形参(p)的值,而实际的指针(如上的s)所指向的地址是不变的。
当然,以上程序还有内存泄露的BUG,“delete []s;”这句根本就销毁不了在函数f()中分配的空间。“HelloWorld”(即函数f申请的100的空间)在内存中还是存在的,只是我们不知道它在哪里。
结合最近做项目的感想,写程序时最好不要在函数内分配空间而在函数外释放,最理想是在哪一级分配,就在哪一级释放。否则内存泄露就如家常便饭了。