clang - Clang 内存分配
问题描述
谁能帮我理解为什么 Clang 在它们的生命周期相交时为不同的变量重新分配相同的内存地址?
我正在使用示例程序(如下)来显示问题。
当我用 clang -O0 编译程序时,函数中的变量与j
函数ok
中的变量具有相同的内存地址。solutions
nqueens
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);
}
解决方案
推荐阅读
- javascript - 找出一个元素是否定义了 CSS“悬停”伪类?
- python - 是否有一个参数可以在 start_http_server (prometheus_client) 而不是 / 中设置其他端点?
- c# - WPF 缩放或缩放精灵图像
- mule - MuleSoft:根本原因是什么?发送 HTTP 请求时出错。(org.mule.api.MessagingException)
- c# - C# - 获取 CURLException 调试输出
- uwp - 如何在 UWP 包中包含依赖项?
- influxdb - 如何在一段时间内的值总和后获得前 5 个结果 influxdb
- javascript - 为什么我收到此错误:未捕获的类型错误:无法读取未定义的属性“serviceId”
- python - Python:requests.session——如何确保我在 Python 2.7.9 中关闭 TCP 连接?
- python - 如何在 html 中显示 Flask 表单数据的摘要?