题1、
为什么会崩溃呢?
#include
#include #include void GetMemory(char** p) { *p = (char*)malloc(100); } void Test(void) { char* str = NULL; GetMemory(&str); strcpy(str, "hello world"); printf(str);//ok free(str); str = NULL; } int main() { Test(); return 0; } 我们可以用二级指针来进行接收,这样在malloc的时候*p找到的就是str的地址,然后malloc申请的空间就是str所指向的了,这样就不会发生解引用NULL的操作了。
#include
#include #include char* GetMemory() { char* p = (char*)malloc(100); return p; } void Test(void) { char* str = NULL; str = GetMemory(); strcpy(str, "hello world"); printf(str);//ok free(str); str = NULL; } int main() { Test(); return 0; } 或者我们可以将p作为返回值返回,并将其赋值给str,这样也可以解决这个问题。
题2、
#include
#include #include char* GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char* str = NULL; str = GetMemory(); printf(str); } int main() { Test(); return 0; } 这个没办法正常输出的原因是什么呢?
题3、
#include
#include #include int* test() { int a = 10; return &a; } int main() { int* p = test(); printf("haha\n"); printf("%d\n", *p); return 0; } 在这个代码里,a只是一个局部变量,在函数里定义了a之后,我们取地址将a的地址返回,a的这块空间,实际上已经被销毁了,所以我们在打印的时候,再去这块地址所指向的空间里找的时候,a就已经被销毁了。
题4、
#include
#include #include 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过后,及时的将其置空。