指针变量传递给一个函数

如下:源程序为

#include "stdafx.h"

#include "string.h"

#include "stdlib.h"

void GetMemory(char *p,int num)

{
p=(char*)malloc(num*sizeof(char));
}

int _tmain(int argc, _TCHAR* argv[])
{
char *str=NULL;
GetMemory(str,10);
strcpy(str,"hello");
printf("str=:%s\n",str);
free(str);//free未起作用,内存泄漏
return 0;
}


运行报错如下:

单步运行到:strcpy(str,"hello");时报错

error:未处理的异常0xC0000005:写入位置0x00000000时发生访问冲突

原因:malloc的内存的地址并没有赋给str,而是赋给了_str(而_str是编译器自动分配和回收的,我们无法使用)。

获取内存可通过如下两种方法:

第一种:使用return(使用二级指针)

char GetMemory(char* p,int num)

{
*p=(char*)malloc(num*sizeof(char));
return p;

}

int _tmain(int argc, _TCHAR* argv[])
{
char *str=NULL;
str=GetMemory(str,10);
strcpy(str,"hello");
printf("str=:%s\n",str);

printf("str length=:%d\n",sizeof(str));
free(str);
return 0;
}

第二种:使用二级指针

void GetMemory(char **p,int num)
{
*p=(char*)malloc(num*sizeof(char));
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str=NULL;
GetMemory(&str,10);
printf("str length=:%d\n",sizeof(str));
strcpy(str,"hello");
printf("str=:%s\n",str);
free(str);
printf("str=:%d\n",str);
system("pause");
return 0;
}

参数为&str而不是str;传递过去的是str的地址。函数内部,用钥匙(“*”)来开锁:*(&str),其值就是str.

所以malloc()分配的内存地址是真正赋值给str本身。



你可能感兴趣的