C语言内存的若干总结

int main(int argc, char *argv[])
{
 char *str = NULL;
 allocateMemory(&str);
 strcpy(str,"hello world");
 printf(str);
 return 0;
}

void allocateMemory(char **p)
{
 *p = (char *)malloc(sizeof();
}
//结果是:hello world 请按任意键继续. . .

但是如果allocateMemory(char **p)函数中是
void allocateMemory(char *p)
{
p = (char *)malloc(100);
}
那么结果是显示错误,究其原因,是因为实参传到形参中的本质是:形参另开辟了一块地址复制了实参及其内容,然而形参在allocateMemory(char *p)函数中又指向了新开辟的地址 p = (char *)malloc(100); 这时候这个形参p和实参p所指的内容就不在相同,所以此时allocateMemory函数外的指针p依旧是指向NULL,结果导致程序崩溃。

另外:如果main()函数中的p不是指向NULL,那么运行结果也是helloworld, 这是因为p此时是随机指向一个地址,并将该地址内容写为helloworld.
接下来分析char**p,如图,指针本身也是有分配的地址,用一个指向指针的指针作为形参,那么就算这个形参在函数运行结束后销毁,但是他所指向的指针已经重新指向新的地址。
在这里插入图片描述
下面这段代码最终的执行结果也是helloworld, 因为这段代码返回值是char指针,将指针所指的地址赋值给main()中的指针p, 使p指向了allocateMemory所分配的地址。局部变量将指针内容传递给p后被销毁,但是经由malloc分配的地址不会被销毁,一直存在到程序执行完毕。


char * allocateMemory(char *p)
{
 *p = (char *)malloc(sizeof();
 return p;
}
//结果是helloworld
发布了9 篇原创文章 · 获赞 0 · 访问量 85

猜你喜欢

转载自blog.csdn.net/ren_x_guo/article/details/104771971
今日推荐