今天,我将写一些有关内存的代码,请大家思考一下。
1.void GetMenory(char *p)
{
p=(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
上述代码当运行Test函数时会有什么结果呢?
结果是段错误;
为何是段错误呢?
因为指针str指向了NULL,而NULL中是不允许存入数据的,它对非法空间进行赋值了。
那为何指针p申请到的堆区空间没有给到指针str呢?
因为这是一个值传递,只是相当于把str中存放的NULL的首地址给到了指针p中,而指针p并不会影响到指针str。
2.char *GetMemory(void)
{
char p[]="hello world";
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
priintf(str);
}
这段代码运行Test时又会有什么样的结果呢?
答案依旧是段错误!那是为何呢?
因为GetMemory函数中数组p存放在堆区,随着函数的结束释放数组p的空间,此时返回的地址没有空间,因此指针str变成了野指针,会报段错误!