C动态内存分配以使指针无效

时间:2014-06-20 19:55:04

标签: c malloc

我有一个函数,我将传递一个结构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

我做错了什么以及如何纠正?

1 个答案:

答案 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 *返回memcpyvoid *需要void **参数。取消引用void *将产生{{1}}以便使用。