首页 > 解决方案 > Clang 内存分配

问题描述

谁能帮我理解为什么 Clang 在它们的生命周期相交时为不同的变量重新分配相同的内存地址?

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

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

Functionok在 function 内部调用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);
}

标签: clangllvmclang++llvm-clang

解决方案


推荐阅读