gpt4 book ai didi

c - 使用固定数组值调用 void** 参数

转载 作者:行者123 更新时间:2023-11-30 14:27:38 24 4
gpt4 key购买 nike

我声明了一个固定大小的数组:

int vals[25];

我想将数组发送到一个函数,该函数将分配 vals 的值:

bool FetchValueArray(char* source, char* name, char* typeFormat, int count, void** destination)
{
int i;
char *t;
t=strstr(source,name);
if (t)
if (destination != NULL)
{
for (i = 0;i < count;i++)
sscanf(t,typeFormat,destination[i]);
return true;
}
return false;
}

这实际上会读取某个搜索字符串之后的所有内容。例如:

FetchValueArray(source,"CONFIG=","%d",15,vals);

其中“CONFIG=”为纯文本,后跟 15 个制表符分隔的数值。

这里我对间接和固定 aized 数组还不太了解,因此我想知道是否可以将固定大小的数组作为 void** 作为参数发送(即使人们相信数组的大小会受到尊重。不同的问题。)

<小时/>

tl;博士版本

int vals[25];
bool foo(int size,void** d);
foo(25,vals);

为什么不允许这样做?

最佳答案

数组会衰减为指向其第一个元素的指针,并且指向任何类型的指针都可以隐式转换为 void*。其次,为了使数组访问正常工作,FetchValueArray 需要知道每个数组元素有多大。您试图传递一个 void**,它是一个指向 void* 的指针,因此数组访问将每个元素视为具有 大小code>void*,这是错误的——数组元素的大小为 int,它不一定与 void* 的大小相同。

所以void**是错误的。相反,您需要传入 void*,这意味着“指向未知类型的指针”。您不能在 void* 上使用数组索引,因为编译器不知道底层指向类型的大小。你需要帮助它。例如:

bool FetchValueArray(char* source, char* name, char* typeFormat, int count, void* destination, size_t destElementSize)
{
...
sscanf(t, typeFormat, (char*)destination + destElementSize * i);
...
}
...
FetchValueArray(source, "CONFIG=", "%d", 15, vals, sizeof(vals[0]));

在这里,我们手动执行数组索引 - 我们将 void* 转换为 char*,它具有已知的指向大小 (1 byte),然后通过乘以每个元素的大小来执行数组偏移。结果是一个指向正确内存位置的指针,这正是 sscanf 所期望的。

不过,这里要非常小心——我认为你应该重新考虑你的设计。编译器不知道函数的语义,因此它无法验证您是否传递了正确的参数。在这里很容易在没有意识到的情况下插入意外的安全漏洞。考虑一下使用编译器可以更彻底验证的不同设计是否会更好。

关于c - 使用固定数组值调用 void** 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com