题目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, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
运行结果:
char* str = NULL;
GetMemory(str);str在这里表示传值调用,p代表形参,形参的改变不影响实参。
改正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, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
通过二级指针接收指针str的地址。
指针变量也是变量,在这里,str并不代表地址。
改正2:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(char* p)
{
p = (char*)malloc(100);
return p;
}
void Test(void)
{
char* str = NULL;
str=GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
通过返回值直接找到动态开辟空间的位置。
题目2
运行完之后会出现什么情况?
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
运行结果:
错误原因:
char p[] = "hello world"; ------p是在栈空间上创建的局部变量,具有生命周期,当这个函数结束返回‘h’的地址后,这块空间就销毁了,当再次打印时,就会打印随机值。
改正:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(void)
{
static char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
static char p[] = "hello world";
把所打印的内容放到静态区上,这样数组p的生命周期变长。不会在这次函数调用后就销毁了。
题目3
这个代码的运行结果是什么?
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<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, "hello");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
题目4
下面代码运行结果是什么?
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
运行结果:
运行结果看着是正确的,但是代码是存在很大问题的。
free(str); //free释放str指向的空间后,并不会把str置为NULL
改正:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
在这里考察的事free后是否将指针置为NULL,应该和free释放位置没太大关联。