内存&传参 问题
一
char *GetMemory(void) //char型函数指针,返回值是一个地址 { char p[] = "hello world"; //定义一个char型数组,里面存放了一个字符串 return p; // return &p[0]; 返回指针所指向的地址 } //运行至此,"hello world"被释放 int main() { char *str = NULL; //定义一个指针,并且让这个指针指向内存的最前端(0x0000 0000),str = NULL str = GetMemory(); //str = &p[0] printf("%s", str); //此时str所指向的地址里面是随机值 return 0; }
结果:输出结果不确定
二:
void GetMemory(char *p, int Num) //str传递过来的是NULL, 也就是p=NULL { p = (char *)malloc(sizeof(char) * Num); } int main() { char *str = NULL; //定义一个指针str,str = NULL GetMemory(str, 100); //将NULL传递过去(传递的是一个值, NULL) strcpy(str, "hello"); //不能将hello 传递进去,因为str没有空间,是个野指针 return 0; }
结果:不能执行strcpy(str, "hello") , 会发生段错误
知识点:
原型char strcpy(char dest , char * source)
运用strcpy()这个函数的时候,确保dest是指向一个空间。否则,运行strcpy()会发生段错误。
三:
void GetMemory(char **p, int num) // p = &str { *p = (char *)malloc(num); //*p = str,也就是说str指向了申请到的内存的首地址 } int main() { char *str = NULL; // 定义一个char型指针str,str = NULL GetMemory(&str, 100); //&str 取的指针str的地址 strcpy(str, "hello"); //把 hello 放进 str 所指向的内存里面 printf("%s", str); free(str); return 0; }
结果:正确输出hello
四:
int main(void) { char *str = (char *) malloc(100); //定义一个char型指针str,并申请100个字节的内存,让str指向这块内存的首地址 strcpy(str, "hello"); //把 hello 放进内存里面 free(str); //将str所指向的内存释放,但str仍然是指向这块内存的首地址,值还在 if(str != NULL) //条件成立 { strcpy(str, "world"); printf("%s", str); } }
结果:正确输出一个world
malloc()获取一块大小指定的可用的内存的使用权
free()释放对这个内存的使用权,