#include <stdio.h> #include <string.h> #include <stdlib.h> void GetMemory(char *p) { p = (char *)malloc(100); } void main(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 以上代码运行结果:程序崩溃 因为 GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。 #include <stdio.h> #include <string.h> #include <stdlib.h> char *GetMemory(void) { char p[] = "hello world"; return p; } void main(void) { char *str = NULL; str = GetMemory(); printf(str); } 代码运行结果:hello...可能是乱码。 因为 GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。 #include <stdio.h> #include <string.h> #include <stdlib.h> void GetMemory(char **p, int num) { *p = (char *)malloc(num); } void main(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } 运行结果: (1)能够输出hello (2)内存泄漏 内存泄漏: 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。 #include <stdio.h> #include <string.h> #include <stdlib.h> void main(void) { char *str = (char *) malloc(100); strcpy(str, "hello"); free(str); if(str != NULL) { strcpy(str, "world"); printf(str); } } 我运行的结果是输出:World 理论结果应该是: 篡改动态内存区的内容,后果难以预料,非常危险。 因为 free(str);之后,str 成为野指针,if(str != NULL)语句不起用。