我有一个函数,我将传递一个结构ID,它将返回一个字符串。 我将传递一个指针来存储名称字符串,该指针将由名为。
的函数分配内存int ConvertIDToName(void *id, void *name, size_t *size)
{
int status = 0;
unsigned char *xIDname = "user4.microsoft.com";
*name = (unsigned char*)malloc(30);
memcpy(*name, xIDName, *size);
...
return(0);
}
main(int argc, char* argv[])
{
struct ID_t idObj ={1,5, {0,0,0,0,0,5}};
unsigned char* IDName = NULL;
UINT32 IDNameSize = MAX_CHAR;
ConvertIDToName(&idObj, &IDName, (size_t *)&IDNameSize);
return(0);
}
函数ConvertIDToName()无法将已分配的内存地址存储在void指针中。 我无法在指针中分配内存,它从函数ConvertIDToName()的第3个语句中给出错误:
warning: dereferencing âvoid *â pointer
test_code.c:683: error: invalid use of void expression
我做错了什么以及如何纠正?
答案 0 :(得分:4)
name
参数的类型为void *
,您可以使用*name
取消引用它。您需要做的是在函数内部使用另一个unsigned char **
类型的指针,或者在name
之前将unsigned char **
投射到/* Use namep instead of name. */
unsigned char **namep = name;
*namep = malloc(30);
memcpy(*namep, xIDName, *size);
...
:
/* Use casts everywhere. */
*(unsigned char **)name = malloc(30);
memcpy(*(unsigned char **)name, xIDName, *size);
...
或:
name
修改强>
根据@WhozCraig的建议,您也可以让自己的功能要求void **
为void *
而不是malloc
。这将避免需要类型转换或其他变量。这是一个很好的建议,因为void *
返回memcpy
而void *
需要void **
参数。取消引用void *
将产生{{1}}以便使用。