一、指针
- 请指出下面一段代码所存在的问题:
int* f2(void)
{
int* ptr;
*ptr = 10;
return ptr;
}
分析:这段代码存在使用野指针问题,指针ptr
并没有初始化,此时储存的时随机值,则ptr
是一个野指针,对野指针解引用会导致崩溃。
二、动态内存管理
- 请指出下面一段代码所存在的问题:
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hellow world");
printf(str);
}
int main()
{
Test();
return 0;
}
1)调用GetMemory
函数时,仅将实参str
的值传递给了形参p
,改变p
变量并不能影响实参str
,因此在调用完GetMemory
函数之后,str
仍是空指针,在调用strcpy时,解引用会导致崩溃。
2)这段代码存在内存泄露问题,当GetMemory
函数调用结束之后,形参p
会被销毁,而此时动态开辟的内存空间没有被释放,因此会发生内存泄漏,而且因为p
被销毁,这部分内存也无法通过其他方式被该程序找到。
- 请问下列代码输出的内容
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
这段代码输出的内容不确定。p
是一个局部的数组,当程序执行完这部分函数时,p
就被销毁了,p
的地址可能被其他程序所使用,而返回值p
的地址是一个野指针,因此不确定其中的内容。
这类问题可以归类为返回栈空间的地址的问题,p
是一个临时变量,储存在栈空间,这部分内存空间只是临时可以使用,当p
所在的部分程序运行结束时,这部分空间就不能再被使用,这是将这个地址返回给别的参数是一件危险的事情,因为这是一个野指针。