第一题
void GetMemory(char* p){
char* p = malloc(40);
}
void Test(void) {
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world"); //程序奔溃
printf(str);
}
int main() {
Test();
return 0;
}
代码执行后奔溃。
这个代码有两处错误
- str 指针想申请内存空间,可是将str传入GetMemory函数后,因为传的不是str的地址,p是str的一份临时拷贝,str将值NULL传给了p,所以最终p申请的空间是p指向的,执完后也没有释放申请的空间,且无法找到,会造成内存泄漏。
- 所以str仍然存放的是NULL,后面通过strcpy函数对str指向的空间存放字符时,时非法访问内存了。
改正1
void GetMemory(char** p){
*p = malloc(40);
}
void Test(void) {
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world")
printf(str);
free(str);
str = NULL;
}
int main() {
Test();
getchar();
return 0;
}
改正2
char* GetMemory(char* p){
p = malloc(40);
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main() {
Test();
getchar();
return 0;
}
第二题
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* GetMemory(void){
char p[] = "hello world"; //栈空间
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
printf(str);
}
int main() {
Test();
getchar();
return 0;
}
错误:p时局部变量,执行完GetMemory函数后,返回了p的地址,可是p执行的空间是栈区,执行完函数后,会被回收,所以将p的地址返回str,打印出随机值。
char* GetMemory(void){
static char p[] = "hello world";//静态工作区
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
printf(str);
}
int main() {
Test();
getchar();
return 0;
}
正确:p所指向的空间通过static修饰,成为了静态工作区的数据,生命周期变长
char* GetMemory(void){
char* p = malloc(40);//堆空间
return p;
}
void Test(void) {
char* str = NULL;
str = GetMemory();
}
int main() {
Test();
getchar();
return 0;
}
正确:p所指向malloc申请的堆空间,手动释放后,或者程序运行结束才会将这块空间还给操作系统
第三题
char* GetMemory(char **p,int num){
* p = (char *)malloc(num);
}
void Test(void) {
char* str = NULL;
GetMemory(&str,100);
strcpy(str, "hello");
printf(str);
}
int main() {
Test();
getchar();
return 0;
}
执行代码,打印出hello,错误就是没有忘记释放动态开辟的内存,导致内存泄露了。
第四题
void Test(void) {
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
//str = NULL; 修改后
if (str != NULL) {
strcpy(str, "world");
printf(str);
}
printf(str);
}
int main() {
Test();
getchar();
return 0;
}
这个题考察的是,free了str后,不会把str置为NULL。所以free后,将str 置为NULL就行。