引用参数、指针调用、内存
<1>
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void swap(int& x,int& y)
{
int temp ;
temp=x;
x=y;
y=temp;
}
void main()
{
int x=5; int y=6;
swap(x,y);
指针传递传递的是变量或对象的地址,是在对变量或对象的原值进行操作,会改变原值;
/*swap(x,y);*/
*******6,5;引用传递形式如值传递但效果同指针传递,是原来变量或对象的别名,是在对变量或对象的原值进行操作
<2>
void getmemory(char*p)
{p=(char *) malloc(100);}
int main()
{
char *str=NULL;
getmemory(str);
strcpy(str,“helloworld”);
printf("%s\n",str);
}值传递,对原值str不起任何影响,str 依旧是NULL,每运行一次就有一块内存泄露,所以当函数的参数是一个指针,不要指望用该指针去申请动态内存。
3.
void *getmemory(void)
{
char p[]="hello";
return p;
}
int main()
{
char *str=NULL;
str=getmemory();
printf("%s\n",str);
}不要用return 语句返回指向“栈内存”的指针,因为该内存在函数结束时自动释放,str指向的地址原先内容不可知,现有内容不清楚,输出乱码
注意:函数的返回值是指针类型的,检查是静态内存指针还是堆内存指针还是栈内存指针,栈内存指针是绝对要不得滴
4、
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重 要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后应把把指针指向NULL,防止指针在后面不小心又被使用,造成无法估计的后果。
int main()
{
char* str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!=NULL)
{
strcpy(str,“world”);
printf(str);
}
return 1;
}
str 所指的内存被释放,但是str 所指的地址仍然不变,if(str!=NULL)没有任何作用。
str变成野指针,“野指针”不是NULL 指针,是指向“垃圾”内存的指针,
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它
的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么
将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);
(2)指针p 被free 或者delete 之后,没有置为NULL,让人误以为p 是个合法的指针。
内存分配:
1.从静态存储区域分配:
内存在程序编译时就已经分配,这块内存在程序整个运行过程都存在。(全局变量,static变量)
2.在栈上创建:
函数内部的局部变量在栈上创建,函数结束后,这些存储单元会自动释放。 分配内存效率高,但是分配内存容量有限。
3.从堆上分配(动态内存分配):
由malloc()和new()手动分配内存,由delete(),free()手动释放内存空间。内存空间由程序员自己决定,可分配的内存容量大。
注意:
malloc申请的是连续的一块内存,当返回NULL表示内存申请失败,用if(NULL!=p)验证, 若是内存分配失败用exit(1),终止整个程序; 栈出现内存泄露情况通常是由没有回收垃圾资源,没有进行内存释放引起的
free(p);斩断了指针与这块内存的关系,
虽然指针P仍然保存原来的地址,但是已经失去了对那块内存的控制权,同样,对应的那块内存虽然内容存在,不过,已经无法利用其中的数据,成为垃圾文件。对于每次malloc()只能有一次free(),若free()两次会出错,除非原指针指向NULL
浙公网安备 33010602011771号