TEST 1:
void GetMemory1(char *p) {
p = (char *)malloc(100);
}
void Test1(void) {
char *str = NULL;
GetMemory1(str);
strcpy(str,"hello world");
printf(str);
}
p是一个处于栈区的变量,生命周期只从定义到区间的‘}’结束;
所以在Getmemory函数结束的时候p的内存被自动释放,无法进行strcpy操作;
TEST 2:
char *GetMemory2(){
char p[] ="hello world";
return p;
}
void Test2(){
char *str = NULL;
str = GetMemory2();
printf(str);
}
同TEST 1,栈区的空间自动释放,无法输出。
TEST 3:
char *GetMemory3(){
char *p ="hello world";
return p;
}
void Test3(){
char *str = NULL;
str = GetMemory3();
printf(str);
}
无问题,可以正常输出;
输出"hello world";
TEST 4:
char *GetMemory4(){
static char p[] ="hello world";
return p;
}
void Test4(){
char *str = NULL;
str = GetMemory4();
printf(str);
}
是合法的,能够正常输出;
经过了static修饰之后,处于栈区的变量延长了生命周期,可以在本文件范围内进行访问;
输出"hello world";
TEST 5:
void Test5(){
char *str = (char *) malloc(100);
strcpy(str,"hello");
free(str);
//str = NULL;
if (str != NULL) {
strcpy(str,"world");
printf(str);
}
}
过早的释放了str的内存,在注释那行之后str已经没有地址了;
无法进行strcpy操作;
TEST 6:
void Test6(){
char *str=(char *)malloc(100);
strcpy(str,"hello");
str+=6;
free(str);
if (str != NULL){
strcpy(str,"world");
printf(str);
}
}
第六行:str+=6;偏移了从堆区申请的空间地址;
释放的空间地址和申请的空间地址必须相同,不能随意偏移;