指针涉及两个内存:
1、指针本身内存
局部指针存放于栈上,当所处作用域消亡,会被自动销毁。
2、指针指向的内存
指针指向的内存如果是malloc则位于堆上,即使指针所在作用域不存在了,该内存只要不被释放则内存泄漏。
char* test_location_pointer()
{
char *ch = "dasdasda";
printf("a %p\r\n",&ch); //指针本身的地址
printf("b %p\r\n",ch); //指针指向的地址
return ch;
//return &ch; //编译器警告,返回了局部变量
}
编译器报警,局部指针。
int main(void)
{
char *c = test_location_pointer();
printf("c %p = %s\r\n\r\n",c,c);
char *ch = test_location_pointer();
printf("ch %p = %s\r\n",ch,ch);
return 0;
}
结果:指向字符串常量的指针b不变,但是指针本身的地址a也不变,对于局部变量应该是要被释放了,可能是编译器优化?
lestly@lestly-virtual-machine:~/桌面/code/pointer$ gcc pointer.c -o pointer
lestly@lestly-virtual-machine:~/桌面/code/pointer$ ./pointer
a 0x7ffedb0e9bd0
b 0x559940459004
c 0x559940459004 = dasdasda
a 0x7ffedb0e9bd0
b 0x559940459004
ch 0x559940459004 = dasdasda
修改test_location_pointer为动态分配
char* test_location_pointer()
{
char *ch = (char*)malloc(10);
strcpy(ch, "hello");
printf("a %p\r\n",&ch); //指针本身的地址
printf("b %p\r\n",ch); //指针指向的地址
return ch;
//return &ch; //编译器警告,返回了局部变量
}
结果:
lestly@lestly-virtual-machine:~/桌面/code/pointer$ gcc pointer.c -o pointer
lestly@lestly-virtual-machine:~/桌面/code/pointer$ ./pointer
a 0x7ffeeaec6010
b 0x559a8debd2a0
c 0x559a8debd2a0 = hello
a 0x7ffeeaec6010
b 0x559a8debd6d0
ch 0x559a8debd6d0 = hello