情形1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char *p)
{
p=(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"helloworld");
printf("%s\n",str);
}
int main(void)
{
Test();
return 0;
}
错误:
1. 调用GetMemory(str),属传值,str并未变化,仍为NULL
2. 调用strcpy,程序到这将产生错误,因为str并未指定某一内存。
3. malloc内存时可能会出错,需判断内存是否申请成功,加上:
if(*p==NULL)
{
进行申请内存失败处理
}
4. 动态创建的内存没释放
修改方法1:
传址-----使用指向指针的指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char **p)
{
*p=(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str);
strcpy(str,"helloworld");
printf("%s\n",str);
}
int main(void)
{
Test();
return 0;
}
修改方法2:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* GetMemory()
{
char* p=(char *)malloc(100);
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
strcpy(str,"helloworld");
printf("%s\n",str);
}
int main(void)
{
Test();
return 0;
}
情形2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *GetMemory(void)
{
char p[]="hello world";
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
printf("%s\n",str);
}
int main(void)
{
Test();
return 0;
}
错误原因:
函数GetMemory中数组p为局部变量,在函数返回后,内存已经被释放,生存期结束。
情形3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"helloworld");
printf("%s\n",str);
}
int main(void)
{
Test();
return 0;
}
可以打印出字符,但存在问题有:
1. 函数GetMemory中,malloc内存后,未判断内存是否申请成功,应加上:
if(*p==NULL)
{
//进行申请内存失败处理
}
2. 在Test函数中,未对malloc的内存进行释放。
情形4:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Test(void)
{
char *str=(char*)malloc(100);
strcpy(str,"helloworld");
printf("%s\n",str);
free(str);
}
int main(void)
{
Test();
return 0;
}
存在问题有:
1. malloc内存后,未判断内存是否申请成功
2. 在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:str=NULL
情形5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Test(void)
{
char *str=(char*)malloc(100);
strcpy(str,"hello");
//str+=6;
free(str);
if(str!=NULL)
{
strcpy(str,"world");
printf(str);
}
}
int main(void)
{
Test();
return 0;
}
在vc中可以输出"world",但这是不确定的值,存在的问题有:
申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题。到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值。所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在程序中当释放一个指针后,一定要人为的将指针付成NULL。这样就会避免出现"野"指针的出现。有人说"野"指针很可怕,会带来意想不到的错误。
情形6
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int *p1,int *p2)
{
int *p;
*p=*p1;
*p1=*p2;
*p2=*p;
}
int main(void)
{
int a=3;
int b=5;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
在swap函数中,p是一个“野”指针,未指向任何内存,所以当将值*p1赋给*p时,值*p1无处存放,会出错。有可能指向系统区,导致程序运行崩溃。
可修改为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int *p1,int *p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
int main(void)
{
int a=3;
int b=5;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}