在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 访问ab。但是代码失败了。如何为结构中声明的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-&gt;p[i] 等价于*((demo_ptr-&gt;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-&gt;p)[i]

问题在于子脚本运算符[] 的优先级高于取消引用运算符*。这可以通过在*demo_ptr-&gt;p 周围加上括号来解决。

另一个问题是demo_ptr 没有指向任何对象。初始化它:

struct demo *demo_ptr = malloc(sizeof *demo_ptr);

【讨论】:

以上是关于在struct中定义指向int指针数组的指针,如何访问这些int?的主要内容,如果未能解决你的问题,请参考以下文章

C语言 如何定义一个二维指针数组?

C++指针问题,请问如何定义一个返回值为结构体指针数组的函数?

C语言如何定义指针指向字符型二维数组

C语言中怎样区分一维指针和二维指针?

C语言如何声明一个返回函数指针的函数?

指针与函数