该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
printf("%c"n", a); //值a改变!
}
4、根据上述的启发,我们也可以采用指向指针的指针来进行在调用函数中申请,在主函数中应用。如下:假设a的地址为ox23,内容为'a';而str的地址是ox46,内容为ox23;而pstr的地址是ox79,内容为ox46。
我们通过调用函数GetMemory,从而将pstr的内容赋给了p,此时p = ox46。通过对*p(ox23)的操作,即将内存地址为ox23之中的值改为char[100]的首地址,从而完成了对char* str地址的分配。
void GetMemory(char** p)
{
char *p = new char[100];
}
void main()
{
char a = 'a';
char* str = &a;
char** pstr = &str;
GetMemory(pstr);
strcpy(str, "hi");
}
5、注意指针的释放问题,可能形成悬浮指针。
当我们释放掉一个指针p后,只是告诉操作系统该段内存可以被其他程序使用,而该指针p的地址值(如ox23)仍然存在。如果再次给这块地址赋值是危险的,应该将p指针置为NULL。
调用函数删除主函数中的内存块时,虽然可以通过地址传递直接删除,但由于无法对该指针赋值(形参不能传值),可能造成悬浮指针,所以此时也应该采用指向指针的指针的形参。例如:
void MemoryFree(char** p)
{
delete *p;
*p = NULL;
}
void main()
{
char *str = new char[100];
char *pstr = &str;
MemoryFree(pstr);
}