是否存在一个“局部的指针变量”?解决方案
是否存在一个“局部的指针变量”?
下面程序据说没问题:
char *getmemory(void)
{
char *ptr=NULL;
ptr = (char*)malloc(20);
return ptr;//ptr不是“局部的指针变量”吗?函数返回后,这个变量难道不可能被在覆盖吗?引用这个变量是安全的吗?
}
int main()
{
char *p=NULL;
p=getmemory();//如果ptr的值还没有传递到p时就被覆盖了怎么办,这种情况会发生吗?
strcpy(p, "hello ");
printf( "%s\n ",p);
free(p);
return 0;
}
------解决方案--------------------
bR = t1(p);
汇编代码如下:
00401FB8 mov ecx,dword ptr [ebp-8] ;将参数放入ecx寄存器
00401FBB push ecx ;参数入栈
00401FBC call @ILT+10(t1) (0040100f) ;函数调用,下一行地址00401FC1入栈
00401FC1 add esp,4 ;函数返回,堆栈指针加4,复原为00401FB8时的值
00401FC4 mov dword ptr [ebp-10h],eax ;从eax中取出高级语言中的函数返回值,放入bR变量中
------解决方案--------------------
问的是C语言,用熟了C++的人就不熟悉了。其实这个是C语言中分配堆内存的最正常不过的用法。不会有问题的。
返回一个局部的指针变量值没有任何问题,问题出在不能返回一个“指向”局部变量的指针变量。
------解决方案--------------------
指针变量就是用来保存地址的变量。
函数退出后,那个局部变量本身当然不存在了。但它所指向的那个地址,却被通过返回值拷贝了出来,并被main函数的变量p继续保存了。
下面程序据说没问题:
char *getmemory(void)
{
char *ptr=NULL;
ptr = (char*)malloc(20);
return ptr;//ptr不是“局部的指针变量”吗?函数返回后,这个变量难道不可能被在覆盖吗?引用这个变量是安全的吗?
}
int main()
{
char *p=NULL;
p=getmemory();//如果ptr的值还没有传递到p时就被覆盖了怎么办,这种情况会发生吗?
strcpy(p, "hello ");
printf( "%s\n ",p);
free(p);
return 0;
}
------解决方案--------------------
bR = t1(p);
汇编代码如下:
00401FB8 mov ecx,dword ptr [ebp-8] ;将参数放入ecx寄存器
00401FBB push ecx ;参数入栈
00401FBC call @ILT+10(t1) (0040100f) ;函数调用,下一行地址00401FC1入栈
00401FC1 add esp,4 ;函数返回,堆栈指针加4,复原为00401FB8时的值
00401FC4 mov dword ptr [ebp-10h],eax ;从eax中取出高级语言中的函数返回值,放入bR变量中
------解决方案--------------------
问的是C语言,用熟了C++的人就不熟悉了。其实这个是C语言中分配堆内存的最正常不过的用法。不会有问题的。
返回一个局部的指针变量值没有任何问题,问题出在不能返回一个“指向”局部变量的指针变量。
------解决方案--------------------
指针变量就是用来保存地址的变量。
函数退出后,那个局部变量本身当然不存在了。但它所指向的那个地址,却被通过返回值拷贝了出来,并被main函数的变量p继续保存了。