/********************************段错误**********************************/
/*#include <stdio.h>
void getmem(char *p)
{
p=(char *)malloc(100);
}
int main()
{
char *str =NULL;
getmem(str);
strcpy(str ,"hello word");
printf ("\n%s\n",str);
}*/
解释:函数参数传递是值传递,函数调用时首先创建实参的副本赋给形参 具体过程如下:
图一
/**********************************乱码*******************************/
/*#include <stdio.h>
char * getmem(void)
{
char p[]="hello word";
return p;
}
int main()
{
char *str =NULL;
str=getmem();
printf ("\n%s\n",str);
}*/
解释:函数内在栈中开辟的内存空间 在函数执行结束时会被释放掉但内容不变,上面的数据P已经被释放掉了,所以STR根本的数组的地址,而得到一个垃圾值打印出乱码。
/************************************正确*************************************/
/*#include <stdio.h>
char * getmem(void)
{
char *p="hello word";
return p;
}
int main()
{
char *str =NULL;
str=getmem();
printf ("\n%s\n",str);
}*/
解释:函数内在堆中分配内存不释放;
/*******************打印正确 但内存不释放***********************************/
/*#include <stdio.h>
void getmem(char **p ,int num)
{
*p=(char*)malloc(num);
}
int main()
{
char *str =NULL;
getmem(&str,100);
strcpy(str ,"hello word");
printf ("\n%s\n",str);
}*/
解释:图二
/*******************************打印正确***********************************/
#include <stdio.h>
int main()
{
char *str =(char *)malloc(100);
strcpy(str ,"hello word");
printf ("\n%s\n",str);
free(str);
}
-
-
Re: C语言指针使用总结
lou zhu shou lei,
du zhe zhou hui.
lun tan xing wang,
shou ru wang qian.