2017-09-17 37 views
-1
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdlib.h> 

void forkexample() 
{ 
    int x = 1; 

    if (fork() == 0) 
     { 
      //printf("this is Child "); 
      ++x; 
      printf("addr of x=%p\n",&x); 
      int* arr1=(int*)malloc(sizeof(int)*5); 
      *arr1=5; 
      printf("Addr of child arr1=%p arr1[0]=%d\n",&arr1,arr1[0]); 
     } 
    else 
    { 
     //printf("this is parent "); 
     --x; 
     printf("addr of x=%p\n",&x); 
     int* arr2=(int*)malloc(sizeof(int)*5); 
     *arr2=6; 
     printf("Addr of parent arr2=%p arr2[0]=%d\n",&arr2,arr2[0]); 
    } 
} 
int main() 
{ 
    forkexample(); 
    return 0; 
} 

screenshot of output相同邏輯地址的叉()

爲什麼& ARR1 = & ARR2?

我知道操作系統將使用寫時複製(COW)方法爲子進程創建新的地址空間,'&'給出邏輯地址,但這裏我們在這裏動態創建2個不同的數組。

回答

2

arr1arr2不是數組,它們是指針。您在forkexample範圍內打印局部變量的地址,就像x一樣。如果要查看由malloc返回的內存地址,則需要printf("%p", arr1),而不是&arr1

假定編譯器決定使用相同的存儲空間來存儲arr1arr2,因爲變量的範圍不重疊。您可以通過代碼更改爲驗證這一理論:

void forkexample(void) 
{ 
    int x = 1; 
    { 
     ++x; 
     printf("addr of x=%p\n", (void *)&x); 
     int *arr1 = malloc(sizeof(int)*5); 
     *arr1 = 5; 
     printf("Addr of child arr1=%p arr1[0]=%d\n", (void *)&arr1, arr1[0]); 
    } 
    { 
     --x; 
     printf("addr of x=%p\n", (void *)&x); 
     int *arr2 = malloc(sizeof(int)*5); 
     *arr2 = 6; 
     printf("Addr of parent arr2=%p arr2[0]=%d\n", (void *)&arr2, arr2[0]); 
    } 
} 

...看看arr1arr2是否仍然有相同的地址。


旁註:printf%p需要void *,而不是int *int **(這是你傳遞什麼)。您需要演員:printf("%p\n", (void *)&arr1);

+0

感謝關於%p,但在父進程和子進程中,無論使用malloc()分配多大的大小,sizeof運算符都會給出恆定大小= 0x4(即int的大小)。 –

+0

@ShashankRao然後我想這就是你平臺上指針的大小。 – melpomene

+0

int * arr1 = malloc(sizeof(int)* 5),但在正常情況下,它應該給5 * sizeof int即5 * 4 = 20B –