我有以下代碼:
struct demo{
int *(*p)[];
};
int main() {
struct demo *demo_ptr;
int a = 1;
int b = 2;
int *arr[2];
arr[0] = &a;
arr[1] = &b;
for (int i = 0; i < 2; i ) {
printf("num in array = %d\n", *arr[i]);
}
demo_ptr->p = &arr;
for(int i = 0; i < 2; i ){
printf("num in array = %d\n", demo_ptr->(*p)[i]);
}
}
我想訪問a和b通過demo_ptr。但是代碼失敗了。如何為p結構中宣告的(指向 int 指標陣列的指標)賦值,以及如何通過 訪問陣列中的這些整數demo_ptr?
uj5u.com熱心網友回復:
對于初學者,您宣告了一個指向不完整型別的指標
struct demo{
int *(*p)[];
};
所以你不能使用sizeof運算子來確定指向陣列中元素的數量。
其次,您定義了一個具有不確定值的未初始??化指標。
struct demo *demo_ptr;
所以再次取消參考這個指標會呼叫未定義的行為。
你應該寫例如
struct demo{
int *(*p)[2];
};
并在主要
struct demo demo;
//...
demo.p = &arr;
for ( size_t i = 0; i < sizeof( *demo.p ) / sizeof( **demo.p ); i )
{
printf( "num in array = %d\n", *( *demo.p )[i]);
}
uj5u.com熱心網友回復:
試試:*(*demo_ptr->p)[i]。
問題是 sub-scripting operator[]比 dereference operator 具有更高的優先級*。這可以通過在 周圍放置括號來解決*demo_ptr->p。
另一個問題是demo_ptr指向沒有物件。初始化它:
struct demo *demo_ptr = malloc(sizeof *demo_ptr);
uj5u.com熱心網友回復:
在下面的:
struct demo{
int *(*p)[];
};
該成員p是指向不完整陣列型別的指標。陣列型別不完整,因為沒有指定長度。陣列元素型別為int *。
不完整的陣列型別不是很有用。在我看來,如果長度不固定,最好定義p為指向指標的指標int:
struct demo{
int **p;
};
然后,在 main():
demo_ptr->p = arr;
/* assuming arr[0] and arr[1] are valid pointers to int: */
for(int i = 0; i < 2; i ){
printf("num in array = %d\n", *demo_ptr->p[i]);
}
(注:*demo_ptr->p[i]相當于*((demo_ptr->p)[i])。)
中的另一個問題main()是demo_ptr未初始化的指標,因此上述取消參考會導致未定義行為。它需要指向struct demo或指向大小至少為 的已分配存盤sizeof (struct demo)。例如:
struct demo *demo_ptr;
struct demo demo;
demo_ptr = &demo;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/356267.html
上一篇:“”有什么用?和“:”在具有指標作為引數的函式中?[復制]
下一篇:為指向指標陣列的指標賦值
