Я думаю, что путаница связана с общим / не общим пространством памяти.
Если вы разветвляете процесс, дочерний процесс будет копией родительского. Единственная разница в потомке и родителе - это возвращаемое значение для fork
. Это означает, что куча также будет в том же состоянии. Так что если после разветвления ребенок и родитель звонят на malloc
, они будут иметь один и тот же адрес. Однако они не будут указывать на такую же память, это потому, что ребенок не разделяет (по умолчанию) память со своим родителем.
Так что, несмотря на то, что dataC
имеет "то же самое" значение ptr в обоих процессах, они оба указывают на разные физические адреса. На самом деле все указатели будут.
Вы можете проверить это с небольшими изменениями в вашей программе.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int dataA[8];
int func(int i) {
return i;
}
int main(int argc, char** argv)
{
int *dataB = malloc(1);
*dataB = 2;
dataA[1] = 7;
int pid = fork();
int *dataC = malloc(1);
int (*func_ptr)(int i) = &func;
printf("pid = %d\ndataA = %p\ndataB = %p\ndataC = %p\nfunc_ptr = %p\n", pid, &dataA, dataB, dataC, func_ptr);
if (pid != 0) {
*dataC = 5;
dataA[0] = 3;
}
printf("pid = %d\n*dataB = %d\n*dataC = %d\ndataA[0] = %d\n", pid, *dataB, *dataC, dataA[0]);
return 0;
}
, которая выдаст что-то вроде:
pid = 26563
dataA = 0x404060
dataB = 0x1275e70
dataC = 0x1275e90
func_ptr = 0x401146
pid = 26563
*dataB = 2
*dataC = 5
dataA[0] = 3
pid = 0
dataA = 0x404060
dataB = 0x1275e70
dataC = 0x1275e90
func_ptr = 0x401146
pid = 0
*dataB = 2
*dataC = 0
dataA[0] = 0