关于malloc问题的改错-笔试常考
情形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;
- }
本文出自 “凉冰” 博客,请务必保留此出处http://liangbing8612.blog.51cto.com/2633208/697911