[llvm-dev] [Clang] memory allocation
David Blaikie via llvm-dev
llvm-dev at lists.llvm.org
Wed Nov 20 14:43:42 PST 2019
You printed &j and &solutions - did you mean to print 'solutions' instead
of '&solutions' Because 'solutions' and 'j' are both local variables in
distinct function calls ('ok' is called, then 'nqueens' is called - so they
can both use/reuse the same stack space for their local variables).
On Wed, Nov 20, 2019 at 1:16 PM Mohammad Norouzi via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Hi,
>
> Could anyone please help me understand why Clang reallocates the same
> memory address for different variables while their lifetime intersect?
>
> Here is an example code:
>
>
> #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);
> }
>
>
>
> When I compile the program with clang -O0 variable j in function ok has
> the same memory address as th variable solutions in function nqueens.
>
> However, compiling it with gcc, they have different memory addresses.
>
> Any help is appreciated!
>
> Best Regards,
> Mohammad
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191120/c75be6c1/attachment.html>
More information about the llvm-dev
mailing list