Я создал родительский и дочерний процессы с помощью fork (), и оба используют общий адрес памяти с именем «ptr».Но я запутался из-за одного выхода программы:
1) Адрес ptr: 123456 ПРИМЕЧАНИЕ. Один и тот же адрес для родительского и дочернего элементов, поэтому ожидается, что если один процесс изменит этот адрес, он должен отразить длядругой тоже процесс, так как адрес тот же.
2) Родитель: * ptr = 44
3) Дочерний: * ptr = 33
4) Значения печати:Родитель по-прежнему сохраняет старое значение: printf ("ptr =% d", * ptr);// Вывод: по-прежнему 44, exp равно 33. Печатает 33, ожидаемое значение.printf ("ptr =% d", * ptr); // печатает 33 штрафа
Вопрос1 ) Может кто-нибудь сказать мне, как значения отличаются?Хотя адрес указателя одинаков как для родительского, так и для дочернего элементов?
Question2 ) Я работаю над инструментом утечки памяти, который дает двойное освобождение, ошибка, так как он видит родителя иребенок бесплатно по тому же адресу.Однако, как мы видим, это не случай двойного освобождения.Как разобраться в этой проблеме?Что касается адреса памяти, который инструмент видит для родительского, а дочерний - тот же адрес?
PS: см. Фрагмент кода ниже:
#include <sys/types.h>
#include <unistd.h>
#include <cstdlib>
int main()
{
int pid, *ptr
ptr=(int*)malloc(sizeof(int));
*ptr=33; // Parent keeps the data as 33, before forking.
if(pid==0){*ptr=44;} // Child modifies data, which is ignored by parent
// Now we print the memory address and the value both by child and parent
if(pid==0)
{
printf("Child data: %u\n",*ptr);
printf("Child address: %u\n",ptr);
}
if(pid>0)
{
printf("Parent data: %u\n",*ptr);
printf("Parent address: %u\n",ptr);
}
}
Вывод: дочерние данные: 44 дочерний адрес: 123456
Родительские данные: 33 (почему все еще старое значение?) Родительский адрес: 123456 (Почему тот же адрес, но данные отличаются от дочерних?)