C++ C++;通过引用调用动态大小的结构,而不知道其大小
我需要使用一个函数(API的一部分),它使用引用调用将一些请求的数据存储到动态大小的结构中。结构定义如下——它涉及posix或NFS4版本的访问控制列表,但我想这只是用例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
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:您确实误解了。;-]这里使用的成语是中描述的。