2010-12-09 157 views
2

所以,我有一個函數用一些字符串數據加載char **變量。我的目標是分解過程,並在孩子中打印一些數據,並從父母打印一些數據。但是,我無法在fork()調用後引用指針。在C中fork()調用之後引用指針C

我認爲fork()的製造父進程,這似乎既包括各種堆棧指針的整個地址空間的副本...

從本質上講,我的代碼目前看起來是這樣的:

load_data(char **data); 

char** data; 
load_data(data); 
printf("String 0: %s\n", data[0]); 
fork(); 
printf("String 0 again: %s\n", data[0]); /* Segfaults Here! */ 

任何人有任何想法我做錯了什麼?我在這方面做了一些谷歌搜索,似乎我在做什麼應該可以工作 - 但事實並非如此。因此,我誤解的東西根本...

+0

*「我還以爲叉()做了一個父進程的整個地址空間的副本,似乎它將包括各種堆棧指針......「*這與這個問題沒有密切關係,但至少在大多數現代UNIX系統中,fork'doesn'在當時複製整個地址空間調用。它使用* copy-on-write *方案;內存頁面在更改後立即被複制。它*感覺*就像`fork`時複製的內存頁面。 – 2010-12-09 01:10:52

回答

3

你做得不好的指針操作剛開幸運在第一次調用 - 這裏的代碼應該是什麼樣子:

load_data(char **data); 

char* data = NULL; 
load_data(&data); 
printf("String 0: %s\n", data); 
fork(); 
printf("String 0 again: %s\n", data); /* Doesn't Segfault Here! */ 
+1

順便說一下,它應該全部爲大寫。 – 2010-12-09 01:09:58

+0

這是假定OP的函數在C++中是`load_data(char *&)`。這可能會是,而OP的使用肯定是錯誤的,但是OP有可能需要一個char **。 – 2010-12-09 01:10:16

1

在你的情況, data沒有指向任何地方。 使用未初始化的變量是未定義的行爲。即使它在load_data函數內部發生更改,該更改也不會在外部可見。

您需要使data指向某個有效的內容,或將data的地址傳遞給函數以使更改「返回」,如load_data(char ***data)


您的代碼,以最小的變化,使之成爲完整的程序, 「作品」 對我來說

#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int load_data(char **data); 

int main(void) { 
    char **data; 
    data = malloc(2 * sizeof *data); 
    assert(data && "no memory"); 
    load_data(data); 
    printf("String 0: %s\n", data[0]); 
    fork(); 
    printf("String 0 again: %s\n", data[0]); 
    return 0; 
} 

int load_data(char **data) { 
    data[0] = "one"; 
    data[1] = "two"; 
    return 2; 
} 

和樣品運行

 
$ ./a.out 
String 0: one 
String 0 again: one 
String 0 again: one