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();
system("pause");
return 0;
}
显然我们发现在调用GetMemory函数时,会把实参str中的NULL传递给p,p中就是NULL,之后,再把动态开辟的内存空间首地址赋值给p,但是str是实际参数,p是形式参数,对于形参的改变并不会影响实参。
因此str中好事NULL,在调用strcppy函数时,函数内部有一步骤是对str解引用,即就是对NULL解引用,对空指针解引用,就会造成程序崩溃。
我们可以看出这个程序实际上的目的是想开辟100个字节的空间,然后把helloworld复制到str所指的空间上,我们想改对他,把传值调用换成传址调用。
2.返回栈空间地址问题
#include<stdio.h>
#include<stdlib.h>
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
system("pause");
return 0;
}
在GetMemory函数运行结束后对helloworld这片空间的访问权限就归还给操作系统,也就是说这片空间的操作权限不属于我们了,再对他操作就是非法访问了。
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, "hello");
printf(str);
}
int main()
{
Test();
system("pause");
return 0;
}
4.free提前释放空间
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str, "hello");
free(str);//已经把str指向的空间还给操作系统,下面的操作已经非法
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
system("pause");
return 0;
}
5.