指针参数是怎么传递内存的
指针参数是如何传递内存的
如果函数的参数是一个指针的话,不要用它去申请动态内存!
如下例子:并未达到预期的期望:
#include<stdio.h> void GetMemory(char *p,int num) { p = (char *)malloc(sizeof(char)*num); } int main(void) { char *str = NULL; GetMemory(str,100);//str 仍然为NULL strcpy(str,"hello"); return 0; }
GetMemory(char *p,int num)的执行过程:
编译器总是会为函数的每个形参制作临时副本,指针参数p的副本就是_p,编译器使_p = p;
函数体内对_p内容的修改就是对p内容的修改。因此指针既为输入参数又为输出参数。
在本例中_p申请了新的内存,只是把_p的内存地址改变了,但是p的内存地址未变!所以
解决办法有两个:
一是;用指向指针的指针去申请动态内存:
#include<stdio.h> //===== //执行过程: void GetMemory(char **p,int num) { *p = (char *)malloc(sizeof(char)*num); } int main(void) { char *str = NULL; GetMemory(&str,100);//
strcpy(str,"hello"); return 0; }
最简单的就是利用return
#include<stdio.h> //===== char *GetMemory(void) { char *p = "hello"; return p; } int main(void) { char *str = NULL; str = GetMemory(); return 0; }
书本中说道:设计概念错误!
char *p = "hello";
"hello"是常量字符串 存储在静态存储区!在其生命周期内恒定不变!不可修改!
- 2楼Oimchuan昨天 15:21
- 解决办法呢???
- 1楼Oimchuan昨天 15:20
- 指向指针的指针!!!