C编译器如何在递归期间处理堆栈中的局部变量?

xun*_*ang 1 c recursion stack

我写了一个简单的二进制搜索程序并遇到问题,请看下面我的三个混淆:

  • 如果我选择icc -g main.cicc -O0 main.c代码返回错误答案,但如果我使用icc -O2 main.c我可以得到正确的答案.

  • 当代码在答案正确mid = (beg + end) / 2;之前定义时,if(beg <= end) {无论我用什么标志来编译它.

  • 我认为问题是mid递归期间堆栈中的局部变量.

帮帮我,谢谢!

#include <stdio.h>
#define MAX 6
int a[MAX] = {1,2,3,4,5,6};
int improved_binary_search(int key, int beg, int end) {
    int mid, temp;
    //mid = (beg + end) / 2;
    if(beg <= end) {
             mid = (beg + end ) /2;
             if(a[mid] == key)
                     return mid;
             if(a[mid] < key)
                     return improved_binary_search(key, mid + 1, end);
              if(a[mid] > key)
                      return improved_binary_search(key, beg, mid - 1);
              //printf("test is %d\n", mid);
      }
      if(mid == 0)
              return 0;
      if(mid == MAX - 1)
              return MAX - 1;
      if(a[mid] < key)
              return a[mid+1] - key < key - a[mid] ? mid+1 : mid;
      if(a[mid] > key)
              return a[mid] - key < key - a[mid-1] ? mid : mid-1;
      return -1;
  }

int main(void)
{
     printf("%d\n", improved_binary_search(100, 0, MAX - 1));
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 5

你刚才宣布mid,但没有初始化它,它可能发生,如果第一,如果条件(if(beg <= end))不然后打的价值mid不确定的.

这将导致未定义的行为.您看到的行为是因为这个UB而不是因为编译器配置.

您应始终将变量初始化为有意义的值.