在C中用叉子搜索

我应该对fork很熟悉,我看到一个练习,说使用fork调用来搜索从0到15索引的数组。我们假设每个进程只能做两件事…( 1)检查数组的长度是否为1,(2)将数组的单个元素与搜索的数字进行比较。 基本上我传给它一个数字,它应该做有限数量的分叉并返回该数字的索引。 这是我的代码..

#define MAXINDEX 16 int forkSearch(int a[], int search, int start, int end){ if(start == end){ if(*(a + end) == search){ return end; } } else{ pid_t child = fork(); if(child == 0) return forkSearch(a, search, start, end/2); else return forkSearch(a, search, (start + end)/2, end); } } int main(int argc, char* argv[]){ int searchArray[MAXINDEX] = {1, 12, 11, 5, 10, 6, 4, 9, 13, 2, 8, 14, 3,\ 15, 7}; printf("Should be 1. Index of 12 = %d\n", forkSearch(searchArray, 12, 0, MAXINDEX)); return 0; } 

这个快速爆炸的程序返回的所有东西似乎都是1,10,11或13.为什么这不应该像它应该的那样工作。

 if(child == 0) return forkSearch(a, search, start, end/2); 

那是错误的end ,应该是(start+end)/2 ,右半部分的搜索开始索引应该是(start+end)/2 + 1 。 否则,如果右半部分是(start+end)/2 .. end ,当end == start+1 ,递归调用的start是旧的起始值,并且您有一个无限循环。

您的程序有未定义的行为,因为

 int forkSearch(int a[], int search, int start, int end){ if(start == end){ if(*(a + end) == search){ return end; } } 

如果start == end ,则不返回值,但*(a+end) != search 。 添加exit(0); 在内部if之后退出没有找到目标的进程。

 int searchArray[MAXINDEX] = {...}; forkSearch(searchArray, 12, 0, MAXINDEX) 

将导致searchArray[MAXINDEX]的越界访问,也是未定义的行为。