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即使大小不同,如果地址相同,结果也会一致。(虽然如果结果相同,这还不足以说明地址与该问题相同。)您有很多格式错误,请参见此处: