Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同一变量的不同内存地址_C++_Memory Management - Fatal编程技术网

C++ 同一变量的不同内存地址

C++ 同一变量的不同内存地址,c++,memory-management,C++,Memory Management,为什么两个k的地址不同,如下面代码的输出所示 #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; r

为什么两个
k
的地址不同,如下面代码的输出所示

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
国际anu[1000000];
整数计算(整数a、整数b、整数c、整数d)
{
长整型k;
k=(长整型)a*d*d+b*d+c;
返回k%1000000;
}
int main()
{
int t,n,i,a,b,c,d,k;
scanf(“%d”、&t);
而(t--)
{   
scanf(“%d%d%d%d%d”、&n、&a、&b、&c、&d);
内存集(anu,0,sizeof(int)*1000000);
anu[d]=1;
载体anu1;
anu1.推回(d);

对于(i=1;i而不采用
k
变量的地址,允许编译器使用寄存器来保存
k
的值

对于大多数处理器,寄存器没有物理地址。它们不在CPU地址空间中

通过打印
k
变量的地址,您告诉编译器要么将变量存储在内存中,要么让编译器生成地址

并非所有变量都需要存储在可寻址内存中;它们可以存储在寄存器中

  • 您应该使用
    %p
  • abs()
    返回浮点数,在打印前将其强制转换为int可以解决问题
  • 线路应正确,包括:

    printf("%d address of final k=%d\n",(int)abs(k),&k);
    
    当我使用clang++(启用尽可能多的警告)进行构建时,我会得到以下警告:

    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);} ^ k、 cpp:45:45:错误:对“abs”的调用不明确 printf(“%d个最终k的地址=%d\n”,abs(k),&k); ^~~ /usr/local/include/c++/v1/cmath:660:1:注意:候选函数 abs(float uux)NOEXCEPT{return fabsf(uuux);} ^ /usr/local/include/c++/v1/cmath:664:1:注意:候选函数 abs(double uuux){returnfabs(uuux);} ^ /usr/local/include/c++/v1/cmath:668:1:注意:候选函数 abs(长双uux){return fabsl(uuux);} ^ 这是因为您没有包含声明
    abs
    整数版本的
    。如果没有包含,编译器必须猜测它应该使用哪个函数,而且它在从
    中选择一个浮点变量时似乎选得不好。这导致您覆盖
    printf呼叫


    在构建程序时,我建议每个人启用尽可能多的警告,他们通常会指出像本例中那样的未定义行为。

    看起来像是积极优化的结果。您是在32位还是64位系统上?
    “k=%d的地址”、&k
    ,您确认过sizeof(int)=sizeof(int*)吗?如果没有,那么printf()将不会像您认为的那样工作。为什么不使用诸如cout之类的类型安全输出,或者甚至在调试器中检查地址,而不是依赖容易出错的printf()?@PaulMcKenzie即使大小不同,如果地址相同,结果也会一致。(虽然如果结果相同,这还不足以说明地址与该问题相同。)您有很多格式错误,请参见此处: