内存管理实例中运行Test函数会有什么样的结果
时间:10-02
整理:3721RD
点击:
- void GetMemory(char *p)
- {
- p = (char*)malloc(100);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(str);
- strcpy(str, "helloworld");
- printf(str);
- }
- 运行Test函数会有什么样的结果?
- 答:
- 程序崩溃;原因:1、实参是通过拷贝的方式
- 传递给行参的;str本身的值依旧是存放
- 了NULL的地址(程序头的空白地址);
- 2、malloc之后没有释放内存;
- char *GetMemory(void)
- {
- char p[] = "hello world";
- return p;
- }
- void Test(void)
- {
- char *str = NULL;
- str = GetMemory();
- printf(str);
- }
- 运行Test函数会有什么样的结果?
- 答:打印乱码,原因:1、p字符串数组的空间是在栈上
- 开辟的,函数执行完之后,该空间释放了;
- str指向了“栈内存”,不是NULL,但数据不存在了;
- 第23行,与char* p = "hello world";
- 有本质的不同;(此处,p指向静态数据区,函数
- 中这样做没有问题)
- 2、printf访问栈内存,很可能存的是垃圾值。
- void GetMemory(char **p, int num)
- {
- *p = (char*)malloc(num);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(&str, 100);
- strcpy(str, "hello");
- printf(str);
- }
- 运行Test函数会有什么样的结果?
- 答:能正常输出,但是malloc没有free,内存泄露;
- 注意:值传递(任何时候,参数传递都是拷贝形式);
- void Test(void)
- {
- char* str = (char*)malloc(100);
- strcpy(str, "hello");
- free(str);
- if(str!=NULL)
- {
- strcpy(str, "world");
- printf(str);
- }
- }
- 运行Test函数会有什么样的结果?
- 答:篡改动态内存区的内容。后果难以确定;
- 因为free(str)之后,str成为野指针;
- str仍有指向原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。
- 因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。
- if(str!=NULL)语句不起作用;