Привет всем Пожалуйста, потратить некоторое время на @ глядя на фрагмент кода ниже:Пожалуйста, помогите мне понять приведенный выше код 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 значения & он идет для освобождения памяти второго раза»
Моих наблюдений:
- недействительных * PTR = NULL; В основном я назначаю этот указатель NULL. Ptr указывает на местоположение 0x0. Адрес Ptr - это что-то 0x28ff40
- func ((void **) & ptr); Здесь я типизирую это с двойным указателем в func() { Я динамически выделяю некоторую память. Так Ptr указывает на какой-то адрес 0x7e36d8
т.е. } - func2 (ничтожной * ptr1) здесь я запутаться: когда я печать PTR: это дает мне 0x7e36d8 и не 0x28ff40 поэтому, когда я сделать PTR = NULL; содержимое в местоположении равно NULL, а не @ 0x28ff40.
Первый вопрос: что я должен изменить в случае, чтобы сделать содержимое @ местонахождения 0x28ff40 = NULL Второй вопрос: Я перепутались с типажей и я не понимаю, как я пропустил базовый адрес: 0x28ff40
Пожалуйста, помогите мне в понимании этого.
Примечание: Пожалуйста, игнорируйте проверки возвращаемых значений. Просьба проигнорировать случаи использования Mix Mix в стиле C/C++. Не предлагайте изменения в аргументе функции.
Спасибо за помощь!
Пожалуйста, дайте мне знать: Что критерии вниз голосования !! ???? что неправильно в вопросе ???????? – user2598064
спасибо, чувак! Chris – user2598064
В обычных обстоятельствах вы не должны использовать 'void *' в C++. –