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

来源:互联网 发布:淘宝违法判刑大全 编辑:程序博客网 时间:2024/06/04 19:23
经典测试代码如下:
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分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。


0 0