题1、
为什么会崩溃呢?🤔🤔🤔
#include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char** p) {*p = (char*)malloc(100); } void Test(void) {char* str = NULL;GetMemory(&str);strcpy(str, "hello world");printf(str);//okfree(str);str = NULL; }int main() {Test();return 0; }
我们可以用二级指针来进行接收,这样在malloc的时候*p找到的就是str的地址,然后malloc申请的空间就是str所指向的了,这样就不会发生解引用NULL的操作了。
#include <stdio.h> #include <stdlib.h> #include <string.h>char* GetMemory() {char* p = (char*)malloc(100);return p; }void Test(void) {char* str = NULL;str = GetMemory();strcpy(str, "hello world");printf(str);//okfree(str);str = NULL; }int main() {Test();return 0; }
或者我们可以将p作为返回值返回,并将其赋值给str,这样也可以解决这个问题。
题2、
#include <stdio.h> #include <stdlib.h> #include <string.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; }
这个没办法正常输出的原因是什么呢?
题3、
#include <stdio.h> #include <stdlib.h> #include <string.h> 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 <stdio.h> #include <stdlib.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过后,及时的将其置空。