C++关于内存与参数传递的几道思考题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fuzhongmin05/article/details/54616553
经典测试代码如下:
void GetMemory(char *p)
{
	p = (char *)malloc(100);	
}
void Test(void)					//1	
{
	char *str = NULL;
	GetMemory(str);
	strcpy(str,"hello world");
	printf(str);
}
char *GetMemory(void)
{
	char p[] = "hello world";
	return p;
}

void Test(void)					//2
{
	char *str = NULL;
	str = Getmemory();
	printf(str);
}
void GetMemory(char **p,int num)	//3
{
	*p = (char*)malloc(num);
}
void Test(void)
{
	char *str = NULL;
	GetMemory(&str,100);
	strcpy(str,"hello world");
	printf(str);
}
void Test(void)					//4
{
	char *str = (char *)malloc(100);
	strcpy(str,"hello");
	free(str);
	if(str != NULL)
	{
		strcpy(str,"world");
		printf(str);
	}
}
void Test(void)				//5			
{ 
  char a;
  char *str=&a;
  strcpy(str,"hello");
  printf(str);
}

运行12345Test函数后分别会有什么结果?

1运行崩溃,因为GetMemory函数不能传递动态内存,Test中的str一直是NULLstrcpy(str,“hello world”)将使程序崩溃

2可能是乱码,因为GetMemory函数返回的是指向栈内存的指针,函数结束后,分配给它的栈空间被回收,该指针的值不是NULL,但其原有内容已经被清除,新内容不得而知。如果想返回一个指向在函数内部定义的变量的指针时,要把那个变量声明为static,这样可以保证该变量被保存在数据段中而不是栈中,该变量的生命期就和程序一样长。

3、能够输出”hello world”,但是Test函数没有对mallo开辟的内存进行释放,存在内存泄漏。

4篡改动态内存区的内容,后果难以预料,非常危险。因为free(str)之后,str成为野指针,虽然指针还指着这个地址,但是这片内存已经不受str控制了,所以里边的内容不知什么时候就被改变了,是个不确定值。if(str != NULL)语句不起作用,不等于NULL的指针不一定就是有效指针,它也可能不再指向合法的内存块free之后一定要给指针变量赋值NULL,以防止形成野指针。任何指针变量都要初始化NULL或者有效地址。

5、没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。


展开阅读全文

没有更多推荐了,返回首页