c - 在 C 中用 fork 搜索

标签 c fork binary-search

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

#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,右半部分搜索的起始索引应该是 (开始+结束)/2 + 1。否则,如果右半部分是(start+end)/2 .. end,当end == start+1时,start为递归调用是旧的 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。在内部 if 之后添加一个 exit(0); 以退出没有找到目标的进程。

int searchArray[MAXINDEX] = {...};

forkSearch(searchArray, 12, 0, MAXINDEX)

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

关于c - 在 C 中用 fork 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876366/

相关文章:

C字符串连接问题函数

c - 追加到 C 数组时出现总线错误

java - 这个修改后的二分搜索实现仍然是 O(log n) 吗?

java - 尝试对对象数组进行二分搜索 [比较器]

arrays - 将n组数据整理成一组

c - 我正在寻找一个能够计算 4x4 和 3x3 矩阵数学的 C 库

c - 将数组传递给 C 中的结构

c - fork /等待 C 程序。我的输出应该是什么?我的输出正确吗?

c - 将 child 的标准输出传递给 parent 标准输入

c++ - 错误 C3861 : '_tcsdup' : identifier not found