在struct中定义指向int指针数组的指针,如何访问这些int?
Posted
技术标签:
【中文标题】在struct中定义指向int指针数组的指针,如何访问这些int?【英文标题】:Define pointer to array of int pointers in struct, how to access those ints? 【发布时间】:2021-12-21 06:03:36 【问题描述】:我有以下代码:
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]);
我想通过demo_ptr
访问a
和b
。但是代码失败了。如何为结构中声明的p
(指向int指针数组的指针)赋值,以及如何通过demo_ptr
访问数组中的这些int?
【问题讨论】:
为什么你需要这个指向指针数组的指针?这一切似乎都是不必要的复杂,没有明显的原因。 【参考方案1】:如下:
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;
【讨论】:
【参考方案2】:对于初学者,您声明了一个指向不完整类型的指针
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]);
【讨论】:
@EricPostpischil 您不能在下标运算符中使用它。 @EricPostpischil 我已经更新了答案。【参考方案3】:试试:*(*demo_ptr->p)[i]
。
问题在于子脚本运算符[]
的优先级高于取消引用运算符*
。这可以通过在*demo_ptr->p
周围加上括号来解决。
另一个问题是demo_ptr
没有指向任何对象。初始化它:
struct demo *demo_ptr = malloc(sizeof *demo_ptr);
【讨论】:
以上是关于在struct中定义指向int指针数组的指针,如何访问这些int?的主要内容,如果未能解决你的问题,请参考以下文章