C++ C++;通过引用调用动态大小的结构,而不知道其大小

C++ C++;通过引用调用动态大小的结构,而不知道其大小,c++,struct,buffer,pass-by-reference,C++,Struct,Buffer,Pass By Reference,我需要使用一个函数(API的一部分),它使用引用调用将一些请求的数据存储到动态大小的结构中。结构定义如下——它涉及posix或NFS4版本的访问控制列表,但我想这只是用例 typedef struct my_struct { unsigned int len; /* total length of the struct in bytes */ ... /* some oth

我需要使用一个函数(API的一部分),它使用引用调用将一些请求的数据存储到动态大小的结构中。结构定义如下——它涉及posix或NFS4版本的访问控制列表,但我想这只是用例

    typedef struct my_struct
    {
      unsigned int len;               /* total length of the struct in bytes */
      ...                             /* some other static sized fields */
      unsigned int version;           /* 2 different versions are possible */
      unsigned int amount;            /* number of entries that follow */
      union {
        entry_v1_t entry_v1[1];
        entry_v2_t entry_v2[1];
      }; 
    } my_struct_t;
有两个版本的条目,我知道我将获得哪一个版本(v1)。
entry\u v1\u t
entry\u v2\u t
都是只包含整数的固定(但大小不同)结构(因此我想它们不值得在这里解释)。现在,我需要使用一个现有函数来填充我的结构,使用引用调用时需要的信息,签名如下,包括注释-我没有访问实现的权限:

    int get_information(char *pathname, void *ptr);

    /* The ptr parameter must point to a buffer mapped by the my_struct
     * structure. The first four bytes of the buffer must contain its total size.
     */

所以关键是,我必须为该结构分配内存,但不知道必须分配多少条目(以及总大小)。您曾经处理过这样的情况吗?

在Windows API下有许多这样的函数,您通常使用一些空指针来调用它们以获取缓冲区的大小,然后使用分配的缓冲区再次调用它们。若在下一次调用期间缓冲区的大小发生了变化,函数将返回错误,您需要重新分配。所以在while循环中执行,直到函数成功返回


所以您的get_信息必须以某种方式实现这样的机制,要么在缓冲区太小时返回false,要么在ptr为NULL时返回正确的大小。但这只是我的猜测。

好吧,我想我知道它是如何工作的。谢谢你的想法和笔记。我声明了一个
my_struct
指针,并在动态数组
=>5*sizeof(unsigned int)
之前为固定大小的字段(5)分配了最小空间。使用该指针调用
get_information
将返回
-1
并设置
errno=28
strerror(errno)=“设备上没有剩余空间”

但是,它将
my_struct->len
字段设置为所需的大小,这似乎就是我的问题的答案——你怎么知道?不,我可以先用最小的空间调用
get_information
,计算出需要分配多少,然后用分配的适当大小的内存再次调用,以成功获取信息

不管怎样,循环解决方案似乎是有意义的,并且将是我的下一次尝试——因为在动态数组中通常只有几个条目


谢谢。

API希望调用方分配内存,即使调用方不知道要分配多少内存?这听起来不像一个伟大的API!这种模式在Windows API中并不少见,但总是有一种机制可以查看要首先分配多少个元素……让我检查一下是否还有其他机会获得条目数。我应该如何解释条目_v1[1]?它是否只是一种占位符,表示后面将有动态数量的条目?@David:
entry\u v1[1]
仅表示长度为1的数组。它恰好是“可变大小结构”技巧的一部分。@01d55:您确实误解了。;-]这里使用的成语是中描述的。