题目一:
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; }
程序运行:
解析:
调用Test函数,在Test函数里str为空指针。然后调用GetMemory函数,GetMemory函数中*p为形参,形参在GetMemory函数调用完后释放,*p释放后没有指针指向malloc开辟的内存地址,造成内存泄漏。形参不改变实参,*str仍是空指针。将"hello world"拷贝放到空指针里面造成非法访问内存,导致程序崩溃。
//正确程序 void GetMemory(char **p) { *p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(&str); strcpy(str, "hello world"); printf(str); free(str); str = NULL; }
题目二:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> 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函数将"hello world"首字母地址传给str,但是当GetMemory函数函数调用完后,"hello world"被销毁,str地址对"hello world"没有了访问权限,因此str为野指针。
题目三:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> 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; }
程序运行:
解析:
没有free,忘记释放。
题目四:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> 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后将"world"拷贝到str里面是非法占用内存。