gpt4 book ai didi

c - 在 C 中编写泛型函数,如何处理字符串

转载 作者:太空狗 更新时间:2023-10-29 16:38:21 26 4
gpt4 key购买 nike

我有一个函数,它接受一个 void** 参数和一个指示其数据类型的整数

void foo (void** values, int datatype)

在函数内部,根据数据类型,我以这种方式 malloc:

if (datatype == 1)
*values = (int*) malloc (5 * sizeof(int));
else if (datatype == 2)
*values = (float*) malloc (5 * sizeof(float));

到目前为止一切都很好。然而,当字符串出现时,事情就变得复杂了。 void** 需要是 void***,因为我需要做这样的事情:

*values = (char**) malloc (5 * sizeof(char*));
for(i=0;i<5;i++)
(*values)[i] = (char*) malloc (10);
..
strncpy( (*values)[0], "hello", 5);

遇到这种情况应该怎么处理?我可以将 char*** 传递给需要 void** 但在其中正确转换的函数吗?

void foo (void** values, int datatype) {

if(datatype == 3) {
char*** tmp_vals = (char***) values;
*tmp_vals = (char**) malloc (5 * sizeof(char*));
...
(*tmp_vals)[i] = (char*) malloc (10 * sizeof(char));
strncpy ( (*tmp_vals)[i], "hello", 5);
}

所以我只是将 void** 转换为 char***。我尝试了这个并忽略了警告,它工作正常。但这安全吗?有没有更优雅的选择?

最佳答案

How should such a situation be handled? Can I pass a char*** to the function that expects a void** but cast it correctly inside it?

不,这在技术上是未定义的行为。它可能看起来在您的计算机上工作,但在未来的某些计算机上可能会失败,这些计算机实现了具有不同表示的不同指针类型,这是 C 语言标准所允许的。

如果您的函数需要一个 void**,那么您最好向它传递一个 void**。任何指针类型都可以隐式转换为 void*,但这只适用于顶层:char* 可以转换为 void*,并且 char** 可以隐式转换为 void*(因为 char** 是“指向 char* 的指针” "), 但 char** 不能 转换为 void**, 同样 char**不能转换为void**

调用此函数的正确方法是向其传递一个适当的 void**,然后将生成的 void* 指针转换回其原始类型:

void foo(void **values, int datatype)
{
if(datatype == 3)
{
char ***str_values = ...;
*values = str_values; // Implicit cast from char*** to void*
}
else
...
}

...

void *values;
foo(&values, 2);
char ***real_values = (char ***)values;

假设 *values 实际上指向一个 char***,那么这个转换是有效的并且在任何代码路径中都没有任何未定义的行为。

关于c - 在 C 中编写泛型函数,如何处理字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19170187/

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