目录
?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void Getmemory(char*p)
{
p = (char*)malloc(100);
}
int main()
{
char*str = NULL;
Getmemory(str);
strcpy(str,"hello world");
printf(str);
return 0;
}
分析:
? ? ? ? getmemory函数创建了一个形参p,赋值为str(NULL)的值,开辟100字节空间并将空间首地址赋给p;
? ? ? ? 将字符串“hello world”拷贝到str,并用printf输出。
问题:
? ? ? ? 1.Getmemory函数采用值传递的方式,无法将malloc开辟空间的地址返回到str中,调用结束后str依然是NULL空指针;? ? ? ? 2.strcpy中使用了str,就是对str(NULL)空指针的解引用操作,程序崩溃;
? ? ? ? 3.malloc的内存没有机会释放,导致内存泄漏。
?正确的写出Getmemory函数的关键是,能正确返回开辟的地址:
1.用传址调用
#include<stdio.h> #include<string.h> #include<stdlib.h> void Getmemory(char**p) { *p = (char*)malloc(100); } int main() { char*str = NULL; Getmemory(str); strcpy(str,"hello world"); printf(str); return 0; }
2.手动return返回
? #include<stdio.h> #include<string.h> #include<stdlib.h> char* Getmemory(char*p) { p = (char*)malloc(100); return p; } int main() { char*str = NULL; str = Getmemory(str); strcpy(str,"hello world"); printf(str); return 0; } ?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* Getmemory(void)
{
char p[] = "hello world";
return p;
}
int main()
{
char* str = NULL;
str = Getmemory();
printf(str);
return 0;
}
分析:
? ? ? ? 创建str初始化为NULL;调用GetMemory函数,在函数中将字符串给p,返回p。
? ? ? ? 打印p指向的内容。
问题:
? ? ? ? 1.返回栈空间的地址导致的错误。
? ? ? ? 2.“hello world”字符串是在GetMemory函数内部的,创建在栈区;在调用GetMemory函数结束后,空间释放,这时返回p给str,str指向的空间不属于我们,str是野指针,对野指针解引用出错。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void GetMemory(char** p,int num)
{
*p = (char*)malloc(num);
}
int main()
{
char* str = NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
return 0;
}
?
分析:
? ? ? ? 此题比较容易?
问题:
? ? ? ? malloc得到的空间在使用后没有释放,并置为空指针。
?在使用动态内存规划后要将开辟的空间释放,指针置空。
#include<stdio.h> #include<string.h> #include<stdlib.h> void GetMemory(char** p,int num) { *p = (char*)malloc(num); } int main() { char* str = NULL; GetMemory(&str,100); strcpy(str,"hello"); printf(str); free(str); str = NULL; return 0; }
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char* str = (char*)malloc(100);
strcpy(str,"hello");
free(str);
if(str!= NULL)
{
strcpy(str,"world");
printf(str);
}
return 0;
}
?
分析:
? ? ? ? 动态内存开辟100字节,空间首地址给str;把字符串“hello”拷贝给str,释放str;
? ? ? ? 问题已经清晰了。
?
问题:
? ? ? ? 1.str指向的空间在使用中释放,这段空间就不属于我们,str成了野指针,但是str不是空指针;
? ? ? ? 2.str不为空,于是进入if,再次使用了str,导致错误。
?
在str被释放后,及时置空,这样就不会进入if中了?
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char* str = (char*)malloc(100); strcpy(str,"hello"); free(str); str = NULL; if(str!= NULL) { strcpy(str,"world"); printf(str); } return 0; }
完~?
未经作者同意禁止转载?