void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
这段代码有什么问题,我们先分析下:
两处问题:1.对NULL指针解压操作,程序会崩溃 2.内存泄漏 我们如何修改呢?
void GetMemory(char* * p)
{
*p = (char*)malloc(100);
if (*p == NULL)
{
perror(malloc);
}
}
void Test(void)
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf("%s",str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
这是第二种方法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* GetMemory()
{
char *p = (char*)malloc(100);
return p;
}
void Test(void)
{
char* str = NULL;
str=GetMemory();
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
这段代码有什么问题,我们先分析下:
问题:这类是返回栈空间地址问题,str是个野指针。
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
问题在哪里呢?
问题:没有释放空间,造成内存泄漏 我们修改下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
}
问题:形成野指针了。