在C中调用fork()之后引用指针

所以,我有一个函数,用一些字符串数据加载一个char **变量。 我的目标是分叉进程,并在子进程中打印一些数据,并从父进程中打印一些数据。 但是,我在fork()调用后无法引用指针。

我认为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! */ 

任何人都有任何想法,我做错了什么? 我已经做了一些谷歌搜索,这似乎我正在做的应该工作 – 但它没有。 因此,我误解了一些基本的东西……

你正在进行糟糕的指针操作,并在第一次调用时获得幸运 – 这就是代码应该是什么样子:

 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! */ 

在您的情况下, data不会指向任何地方。 使用未初始化的变量是未定义的行为。 即使它在load_data函数内部发生了变化,外部也不会看到变化。

您需要使data指向有效的内容,或者将data地址传递给函数以使更改“返回”,如load_data(char ***data)


您的代码只需要很少的更改就可以使它成为一个完整的程序,对我来说“有效”

 #include  #include  #include  #include  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 
字符串0:一个
字符串0:1
字符串0:1