#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int *p,*q,**pp;
p = (int*) malloc( 3*sizeof(int) );
for(int i = 0;i < 3;i++)
{
*(p+i) = i+1;
}
q = (int*) malloc( 4*sizeof(int) );
for(int i = 0;i < 3;i++)
{
*(q+i) = i+5;
}
pp = (int **) malloc(2*sizeof(int*));
*pp++ = p;
*pp = q;
printf("%d,%d\n",*(*(pp+1)+1),**(--pp));
free(p);free(q);free(pp);
return 0;
}
答:程式的輸出結果如下:
6,1
中的
*pp++ = p;
*pp = q;
printf("%d,%d\n",*(*(pp+1)+1),**(--pp));
是什么意思,分別代表什么?
uj5u.com熱心網友回復:
推導如下:p[3] = {1,2,3}
q[4] = {5,6,7,0}
*pp++ = p 相當于 pp[0] = p
*pp = q (后置++后) 相當于 pp[1] = q
*(pp+1) = q;
*(*(pp+1)+1) = *(q+1) = q[1] = 6;
pp++ = q ==》此句結束后 pp+1 => pp[1]
*(--pp) = p = &p[0] =>pp先-- =》pp[0] *(pp[0]) => p =>&p[0]
**(--pp) = p[0] = 1;
也不知表達清楚了沒,供參考吧
uj5u.com熱心網友回復:
想分析這些指標的含義,可以考慮把這些指標的地址列印出來%p,以便分析。*(*(pp+1)+1)
這個地方越界了,因為pp申請了2個int *型別的空間,并且在列印之前pp已經指向了第二個int *。因此再pp+1已經越界了。所以這個輸出是未定義行為。
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int *p,*q,**pp;
int i;
p = (int*) malloc( 3*sizeof(int) );
for(int i = 0;i < 3;i++)
{
*(p+i) = i+1;
}
q = (int*) malloc( 4*sizeof(int) );
for(int i = 0;i < 3;i++)
{
*(q+i) = i+5;
}
pp = (int **) malloc(2*sizeof(int*));
printf("%p, %p, %p, %p\n", p, q, pp, pp+1);
*pp++ = p;
*pp = q;
printf("%p, %p, %p, %p\n", p, q, pp, pp-1);
printf("%p, %p, %p, %p\n", p, q, pp, pp+1);
for (i = 0; i < 3; i++)
printf("%d\t", *(*pp + i));
putchar(10);
printf("%d,%d\n",*(*(pp+1)+1),**(--pp));
free(p);
free(q);
free(pp);
return 0;
}
代碼中:
*pp++ = p;是指將p賦值給*pp,然后pp++;即pp指向第二個int*元素。(malloc申請了2個int *, 并且pp指向第一個int *)
*pp = q;這個就好理解了,第二個元素存q的地址。
uj5u.com熱心網友回復:
*pp++ = p;
//后綴運算子優先級高于賦值運算子,*pp++ = p執行順序: *pp,*pp=p,pp++ 也就是上面說的pp[0] = p
*pp = q;
//pp++后, pp[1] = q
printf("%d,%d\n",*(*(pp+1)+1),**(--pp));
/*
*(pp+1) = q
(*(pp+1)+1) = q+1
*(*(pp+1)+1) = *(q+1) -> q[1] = 6
得 *(*(pp+1)+1) = 6
上一步 pp+1后是 pp[1],(--pp) = pp[0]
*(--pp) = *pp[0] -> *p[0]
p[0] = 1,得 **(--pp) = 1
*/
uj5u.com熱心網友回復:
這三條陳述句,*pp++ = p;
*pp = q;
printf("%d,%d\n",*(*(pp+1)+1),**(--pp));
由于第一條后pp已經自增,所以再執行(pp+1)就越界了,
不過這有個BUG,就是printf的執行順序問題,這里先執行(--pp),所以程式陰差陽錯的對了
uj5u.com熱心網友回復:
樓主可以試試只輸出一個printf("%d\n",*(*(pp+1)+1));
就會發現問題了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17615.html
標籤:C語言
