我有一个函数,它接受一个 void**
类型的参数和一个整数,用于指示其数据类型。
void foo (void** values, int datatype)
在函数内部,根据数据类型,我以这种方式进行动态分配内存:
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***
。我尝试了一下,忽略了警告信息,它可以正常运行。
但这样做安全吗?有更好的替代方法吗?
char
指针指向什么? - Seva Alekseyevvoid*
是通用的,但void**
不是。 - Grijesh Chauhan