【问题标题】:C Dynamic Memory Allocation to void pointerC动态内存分配到空指针
【发布时间】:2014-06-20 19:55:04
【问题描述】:

我有一个函数,我将向它传递一个结构 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() 的第三条语句的错误:

warning: dereferencing âvoid *â pointer
    test_code.c:683: error: invalid use of void expression

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

【问题讨论】:

    标签: c malloc


    【解决方案1】:

    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);
    
    ...
    

    编辑

    根据@WhozCraig 的建议,您也可以让您的函数要求namevoid ** 而不是void *。这将避免类型转换或其他变量的需要。这是一个很好的建议,因为malloc 返回一个void *memcpy 需要一个void * 参数。取消引用 void ** 将产生一个 void * 以供使用。

    【讨论】:

    • 您也可以使用void**。它不像void * 是强类型的。
    • 感谢 Chrono 和 Craig 的宝贵建议。该解决方案解决了该问题。我错过了在使用 void 指针之前对它进行类型转换的简单事情。
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 2015-02-05
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多