请帮助我理解上面的代码行为。了解Void Pointers& double void Pointer Manipulation

时间:2013-11-22 12:13:59

标签: c++ casting void-pointers

大家好请花一些时间@查看下面的代码段:

#include <iostream>
#include <stdlib.h>


using namespace std;
int func2(void* ptr1)
{
    cout << " IN Func2" << endl;
    if(ptr1)
    {
     //i freed this Pointer.       
     free(ptr1);       
     ptr1 = NULL;           
     cout << "PTR MADE NULL" << endl;
     return 1;
    }
}

int func(void** ptr1)
{
 cout << " IN Func" << endl;   
 int *ptr2 = (int*)malloc(10*sizeof(int));

 if(ptr1)
 {
 *ptr1 = ptr2;        
 cout << " NOT NULL" << endl;
 return 1;
 }
 else
 {
 cout << " NULL " << endl;         
 return 0;
 }
}

int main()
{    
 int res = 0;
 void *ptr = NULL;   
 func((void**)&ptr);
 res = func2((void*)ptr);
 if(res)
 {
   //Expecting this to be updated with NULL.. surely not working 
   if(ptr)
   {
   //why I'm Coming here       
   cout << "Freeing Ptr for 2nd time " << endl;       
   free(ptr);     
   }
 }
 cin.get();
 return 0;   
}

请帮助我理解上面的代码行为。 我对“为什么ptr指针没有被赋值为NULL值&amp;它用于第二次释放内存”这一部分更感兴趣

我的观察:

  1. void * ptr = NULL;在main中,我将此指针指定为NULL。 Ptr指向位置0x0。 Ptr的地址是0x28ff40
  2. FUNC((无效**)及PTR);在这里,我使用双指针进行类型转换     在func()中     {      我动态分配一些内存。所以Ptr指向一些地址,即0x7e36d8
        }
  3. func2(void * ptr1)     在这里我感到困惑:当我打印ptr:它给了我0x7e36d8而不是0x28ff40     所以当我使ptr = NULL;位置的内容为NULL,而不是@ 0x28ff40。
  4. 第一个问题:如果要制作内容@ location 0x28ff40 = NULL,我应该修改什么 第二个问题:我搞砸了类型转换,我不明白我是如何错过基地址的:0x28ff40

    请帮助我理解这一点。

    注意:请忽略返回值验证。请忽略C / C ++风格的混合使用情况。不建议更改函数参数。

    提前感谢人们!!!

1 个答案:

答案 0 :(得分:1)

您需要将ptr的地址传递给经过调整的func2()

修改func2()以像func()

一样工作
int func2(void** ptr1)
{
  cout << " IN Func2" << endl;
  if(*ptr1)
  ...

然后这样称呼它:

res = func2((void**)&ptr);