70,020
社区成员




#include<iostream>
#include<string>
using namespace std;
struct S{
int i;
int *p;
};
int main(){
S s;
int *p = &s.i;
p[0] = 3;
p[1] = 0;//这时p[1]的地址是:00000000
cout<<"p的地址:"<<&p[0]<<"\t s.i的地址:"<<&s.i<<endl;
cout<<"p[1]的地址:"<<p[1]<<"\t s.i的地址:"<<&s.p<<endl;
cout<<"p[0]的值:"<<p[0]<<"\t s.i的值:"<<s.i<<endl;
cout<<"p[1]的值:"<<p[1]<<"\t s.p的值:"<<s.p<<"\t s.p的地址:"<<&s.p<<endl;
s.p = p;//这里的s.p保存的是p的地址,s.p本身的地址没变
cout<<"s.p的值:"<<s.p<<"\t s.p的地址:"<<&s.p<<endl;
s.p[0] = 1;
cout<<"s.p[0]的值:"<<s.p[0]<<"\t s.p[0]的地址:"<<&s.p[0]<<endl;
cout<<"s.p[1]的值:"<<s.p[1]<<"\t s.p[1]的地址:"<<&s.p[1]<<endl;
s.p[1] = 0;//问题出在这里了这时s.p[1]的地址改变为了00000004,而s.p的保存的值为0000000
cout<<"s.p[1]的地址:"<<&s.p[1]<<"\t s.p的值为:"<<s.p<<endl;
//cout<<"s.p[1]的值:"<<s.p[1]<<endl;如果加上这句就出错,因为s.p[1]的地址被改变为了00000004
//我们可能觉得s.p[1]指向的应该是s.p值,其实不是因为s.p的值没有改变
return 0;
}
struct S{
int i;
int *p;
};
void main(){
S s;
int *p=&s.i;
p[0]=3;
p[1]=3;
s.p=p;
// s.p[1]=(int)&p;
s.p[1]=1; // <== 这里还不越界吗?
s.p[0]=2;
}