lang内存分配

时间:2019-11-26 12:27:44

标签: clang llvm clang++ llvm-clang

任何人都可以帮助我理解为什么Clang在生命周期相交时会为不同的变量重新分配相同的内存地址吗?

我正在使用示例程序(如下)显示问题。

当我使用clang -O0编译程序时,函数j中的变量ok与函数solutions中的变量nqueens具有相同的内存地址。

函数ok在函数nqueens内部被调用,这意味着变量的生存期相交;两种功能不能使用/重复使用相同的堆栈空间。

使用gcc上的clang-O1编译程序,但是,它们被分配了不同的内存地址。

感谢您的帮助!

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <alloca.h>

/* Checking information */

static int solutions[] = {
  1,
  0,
  0,
  2,
  10, /* 5 */
  4,
  40,
  92,
  352,
  724, /* 10 */
  2680,
  14200,
  73712,
  365596,
};
#define MAX_SOLUTIONS sizeof(solutions)/sizeof(int)

int total_count;
int sharedVar = 0;

int ok(int n, char *a)
{
  int i, j;
  char p, q;
  printf("jjjjjjjjj: %d, %p\n", n,&j);
  for (i = 0; i < n; i++) {
    p = a[i];


    for (j = i + 1; j < n; j++) {
      q = a[j];
      if (q == p || q == p - (j - i) || q == p + (j - i))
    return 0;
    }
  }
  return 1;
}

void nqueens (int n, int j, char *a, int *solutions)
{
  int i,res;
  sharedVar = sharedVar * j - n;
  if (n == j) {
    /* good solution, count it */
    *solutions = 1;
    return;
  }
  printf("solutions: %d, %p\n", j, &solutions);
  *solutions = 0;

  /* try each possible position for queen <j> */
  for (i = 0; i < n; i++) {
    a[j] = (char) i;
    if (ok(j + 1, a)) {
      nqueens(n, j + 1, a,&res);
      *solutions += res;
    }
  }
}

int main()
{
  int size = 3;
  char *a;
  // printf("total_count: %p\n", &total_count);
  total_count=0;
  a = (char *)alloca(size * sizeof(char));
  printf("Computing N-Queens algorithm (n=%d) ", size);
  sharedVar = -5;
  nqueens(size, 0, a, &total_count);
  printf("completed!\n");
  printf("sharedVar: %d\n", sharedVar);
}

0 个答案:

没有答案