user-0 提问: 指针问题

回复:
user: user-0
content: 捯明白了，s.p[1]=1意思是（*s.p）+1=>s.p,谢谢大家！

user: user-1
content: LZ这些基础还这么模糊，还是别看面试宝典先，看基础的

user: user-1
content: 引用 7 楼 ysmz4 的回复:[quote=引用 1 楼 xihu1364 的回复:]  struct S { int i; int * p;};   main ()   {S s ;   int *p =&s.i ;   p[0]=4;   p[1]=3;//这里越界了  你把s.p指针的地址给改了   s.p=p;   s.p[1]=1;  s.p[0]=2: //越界  }  //正确代码 struct S  {     int i;     int * p; };  void main() {    S s ;    int *p =&s.i ;    *p = 4;     s.p = p;    *s.p = 1;  }    看你写的意思，是想S结构体中的*p指向S中的i 后面又用了一个指针指向i...  汗！挺乱的...  还是想问 s.i和s.p的存储顺序问题[/quote]  p[1]=3; 你知道这句代表着什么吗？你这里把S结构体中的成员变量*p的指向地址改成了3，而3这个地址是什么，你知道吗？3这个地址是你申请的？这很危险...

user: user-2
content: struct S { int i; int * p;};  // 这里只是定义了结构，没有定义结构变量 main ()  // 连返回值都没写，能编译过去？至少加个void吧  {S s ;  // 局部变量，会在栈中，结构里的i和p是连续存储的  int *p =&s.i ; // p指向结构中的i地址，也是结构的首地址  p[0]=4; // 所以p[i]就是结构中的第一个域i,p[1]就是第二个域p，所以赋值后，相当于s.i=4, s.p=3  p[1]=3;   s.p=p; // 把p指针值赋给s.p，也就是s.p指向了结构本身的首地址(因为p指向结构的首地址)  s.p[1]=1; // 那么此时s.p[0]就指向了结构中的i,s.p[1]指向了结构中的p。所以赋值2后结构中的 s.p[0]=2: // p指针就是1，此时s.p[0]不再指向结构中的i了，而是地址1。这里相当于往地址1写 }        // 2，这是不允许的，立马崩溃。还有这里不能是冒号，该是分号吧？

user: user-2
content: 带你读一次这个程序好了，没人这么写程序的，除非喜欢自孽。读懂这个程序你就明白在哪里会崩溃了。 struct S { int i; int * p;};   // 这里只是定义了结构，没有定义结构变量 main ()            // 连返回值都没写，能编译过去？至少加个void吧  {S s ;             // 局部变量，会在栈中，结构里的i和p是连续存储的  int *p =&s.i ;     // p指向结构中的i地址，也是结构的首地址  p[0]=4;            // 所以p[i]就是结构中的第一个域i,p[1]就是第二个域p，所以赋值后，相当于  p[1]=3;            // s.i=4, s.p=3   s.p=p;             // 把p指针值赋给s.p，也就是s.p指向了结构本身的首地址(因为p指向结构的首地址),  s.p[1]=1;          // 那么此时s.p[0]就指向了结构中的i,s.p[1]指向了结构中的p。所以赋值后结构中的 s.p[0]=2:           // p指针就是1，此时s.p[0]不再指向结构中的i了，而是地址1。这里相当于往地址1写 } // 2，这是不允许的，立马崩溃。还有这里不能是冒号，该是分号吧？

user: user-0
content: 引用 1 楼 xihu1364 的回复: struct S { int i; int * p;};   main ()   {S s ;   int *p =&s.i ;   p[0]=4;   p[1]=3;//这里越界了  你把s.p指针的地址给改了   s.p=p;   s.p[1]=1;  s.p[0]=2: //越界  }  //正确代码 struct S  {     int i;     int * p; };  void main() {    S s ;    int *p =&s.i ;    *p = 4;     s.p = p;    *s.p = 1;  }    看你写的意思，是想S结构体中的*p指向S中的i 后面又用了一个指针指向i...  汗！挺乱的...  还是想问 s.i和s.p的存储顺序问题

user: user-0
content: 越界了没错，题目问的是崩溃，是在最后s.p[0]=2这句，因为访问0x00000001空间，“对于一个未声明的地址直接访问”

user: user-0
content: 这是面试员宝典的题。 “p[1]=3;//这里越界了  你把s.p指针的地址给改了” 意思就是说，s.p存放在s.i后面，是吧，但是： 解释代码中， struct S {    int i;    int *p; }; int _tmain(int argc, _TCHAR* argv[]) {   S s;   int *p=&s.i;   p[0]=1;                                  p[1]=5;                                      cout<<p[0]<<" "<<s.i<<endl;     cout<<&p[0]<<" "<<&s.i<<endl;   cout<<p[1]<<" "<<s.p<<" "<<endl;   cout<<&p[1]<<" "<<&s.p<<" "<<&s.p[1]<<endl;   cout<<endl;    s.p=p;     cout<<p[0]<<" "<<s.i<<endl;     cout<<&p[0]<<" "<<&s.i<<endl;   cout<<p[1]<<" "<<s.p<<" "<<s.p[1]<<endl; // p[1] == s.p[1] 为什么   cout<<&p[1]<<" "<<&s.p<<" "<<&s.p[1]<<endl;   s.p[1]=1;   cout<<s.p<<" "<<&s.p<<endl;  	return 0; }   p[1] == s.p[1] 为什么？

user: user-3
content: 乱！ 建议直接debug下，用实践检验。

user: user-4
content: 数组p的大小或者是fixed(你自己指定)，或者是dynamic（通过malloc等动态的分配内存），否则会越界。

user: user-4
content: 仅供参考：  #include<stdio.h> #include<stdlib.h>  typedef struct _S { 	int i; 	int *p; /*array*/ } S; int main () { 	S *s = (S *) malloc(sizeof(S)); 	int *p = (int *) malloc(sizeof(int)*2);  	p[0]=4; 	p[1]=3;  	s->p = p;  	printf("%d, %d\n",s->p[0], s->p[1]); 	return 0; }

user: user-1
content: struct S { int i; int * p;};   main ()   {S s ;   int *p =&s.i ;   p[0]=4;   p[1]=3;//这里越界了  你把s.p指针的地址给改了   s.p=p;   s.p[1]=1;  s.p[0]=2: //越界  }  //正确代码 struct S  {     int i;     int * p; };  void main() {    S s ;    int *p =&s.i ;    *p = 4;     s.p = p;    *s.p = 1;  }    看你写的意思，是想S结构体中的*p指向S中的i 后面又用了一个指针指向i...  汗！挺乱的...