2013-11-22 1 views
-1

Привет всем Пожалуйста, потратить некоторое время на @ глядя на фрагмент кода ниже:Пожалуйста, помогите мне понять приведенный выше код behaviour.Understanding утратившими силу указателей & двойной пустой указатель Манипуляции

#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 значения & он идет для освобождения памяти второго раза»

Моих наблюдений:

  1. недействительных * PTR = NULL; В основном я назначаю этот указатель NULL. Ptr указывает на местоположение 0x0. Адрес Ptr - это что-то 0x28ff40
  2. func ((void **) & ptr); Здесь я типизирую это с двойным указателем в func() { Я динамически выделяю некоторую память. Так Ptr указывает на какой-то адрес 0x7e36d8
    т.е. }
  3. func2 (ничтожной * ptr1) здесь я запутаться: когда я печать PTR: это дает мне 0x7e36d8 и не 0x28ff40 поэтому, когда я сделать PTR = NULL; содержимое в местоположении равно NULL, а не @ 0x28ff40.

Первый вопрос: что я должен изменить в случае, чтобы сделать содержимое @ местонахождения 0x28ff40 = NULL Второй вопрос: Я перепутались с типажей и я не понимаю, как я пропустил базовый адрес: 0x28ff40

Пожалуйста, помогите мне в понимании этого.

Примечание: Пожалуйста, игнорируйте проверки возвращаемых значений. Просьба проигнорировать случаи использования Mix Mix в стиле C/C++. Не предлагайте изменения в аргументе функции.

Спасибо за помощь!

+0

Пожалуйста, дайте мне знать: Что критерии вниз голосования !! ???? что неправильно в вопросе ???????? – user2598064

+0

спасибо, чувак! Chris – user2598064

+0

В обычных обстоятельствах вы не должны использовать 'void *' в C++. –

ответ

1

Вам необходимо передать адрес ptr с поправкой func2().

Изменить func2() работать как func():

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

Затем вызовите его следующим образом:

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

Я бы сделал это .. без предложений ... – user2598064