题目一:
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
void GetMemory(char* p) { p = (char*)malloc(100); } void Test(void) { char* str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } int main() { Test(); return 0; }
2.代码分析
str传给GetMemory函数的时候传递的是值,所以GetMemory函数的形参p接收的是一个空指针。GetMemory函数在内部进行动态空间申请,地址存放在p中,并不会影响Test函数中的str。所以str的值依旧是NULL,所以strcpy失败。并且当GetMemory函数运行完之后,形参p销毁,而动态开辟的100个字节内存并没有释放,这样就会导致内存泄露。
3.图解
- 错误更正
char* GetMemory(char* p) { p = (char*)malloc(100); return p; } void Test(void) { char* str = NULL; str = GetMemory(str); strcpy(str, "hello world"); printf(str); free(str); str = NULL; } int main() { Test(); return 0; }
题目二
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
char* GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char* str = NULL; str = GetMemory(); printf(str); } int main() { Test(); return 0; }
- 代码分析
GetMemory函数内部创建的数组是在栈区上创建的,当函数结束时,这块空间也就销毁了,因此p数组是没有空间的,返回p数组的地址没有实际意义。如果str通过返回的地址去访问内存,就是非法访问。 - 图解
- 错误更正
char* GetMemory(void) { char* p = (char*)malloc(15); p = "hello world"; return p; } void Test(void) { char* str = NULL; str = GetMemory(); printf(str); } int main() { Test(); return 0; }
题目三
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
void GetMemory(char** p, int num) { *p = (char*)malloc(num); } void Test(void) { char* str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } int main() { Test(); return 0; }
- 代码分析
GetMemory函数获取str的地址,然后动态开辟一块空间,把这块空间的地址交给str,最后拷贝“hello”并打印,没有一点问题,但是他没有进行内存释放,会导致内存泄漏。 - 图解
- 错误更正
void GetMemory(char** p, int num) { *p = (char*)malloc(num); } void Test(void) { char* str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); free(str); str = NULL; } int main() { Test(); return 0; }
题目四
- 问题
请问下面这段代码,运行Test 函数会有什么样的结果?
void Test(void) { char* str = (char*)malloc(100); strcpy(str, "hello"); free(str); if (str != NULL) { strcpy(str, "world"); printf(str); } } int main() { Test(); return 0; }
- 代码分析
这个代码的问题在于没有把置空,会导致野指针,野指针是非常危险的。当free时,动态开辟的空间已经被释放了,只不过str还记得这块空间的地址,在给这块空间赋值属于是非法访问。 - 图解
- 错误更正
void Test(void) { char* str = (char*)malloc(100); strcpy(str, "hello"); free(str); str = NULL; if (str != NULL) { strcpy(str, "world"); printf(str); } } int main() { Test(); return 0; }