Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Different memory address of same variable

Why is the address of two k different as shown in output of following code?

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
int anu[1000000];
int calc(int a,int b,int c,int d)
{
    long long int k;
    k=(long long int)a*d*d+b*d+c;
    return k%1000000;
}
int main()
{
    int t,n,i,a,b,c,d,k;
    scanf("%d",&t);
    while(t--)
    {   
        scanf("%d %d %d %d %d",&n,&a,&b,&c,&d);
        memset(anu,0,sizeof(int)*1000000);
        anu[d]=1;
        vector<int> anu1;
        anu1.push_back(d);
        for(i=1;i<n;i++)
        {
            k=calc(a,b,c,anu1[i-1]);
            anu1.push_back(k);
            anu[k]=anu[k]?0:1;
        }
        d=0;k=0;
        printf("address of k=%d ",&k);
        for(i=0;i<1000000;i++)
        {
            if(anu[i])
                {
                if(d%2)
                k-=i;
                else
                k+=i;
                d++;
            }
        }
        printf("%d address of final k=%d\n",abs(k),&k);
    }
    return 0;
}

Input: 1 1 1 1 1 1

Output: Address of k=-1074414672 0 address of final k=1072693248

like image 593
Jaswant Singh Ranawat Avatar asked Feb 14 '23 12:02

Jaswant Singh Ranawat


1 Answers

When I build with clang++ (with as many warnings enabled as I could) I get these warnings:

k.cpp:45:45: error: call to 'abs' is ambiguous
        printf("%d address of final k=%d\n",abs(k),&k);
                                            ^~~
/usr/local/include/c++/v1/cmath:660:1: note: candidate function
abs(float __x) _NOEXCEPT {return fabsf(__x);}
^
/usr/local/include/c++/v1/cmath:664:1: note: candidate function
abs(double __x) _NOEXCEPT {return fabs(__x);}
^
/usr/local/include/c++/v1/cmath:668:1: note: candidate function
abs(long double __x) _NOEXCEPT {return fabsl(__x);}
^

This is because you don't include <cstdlib> which declares the integer version of abs. Without that include the compiler have to guess which function it should use, and it seems it chooses poorly as it picks one of the floating point variants from <cmath>. This leads to you overwriting the next argument in printf call.

When building a program, I advise everyone to enable as many warnings as possible, they usually point out things like undefined behavior as in this case.

like image 116
Some programmer dude Avatar answered Feb 16 '23 01:02

Some programmer dude