【问题标题】:What effect does casting a variable as (void *) have?将变量转换为 (void *) 有什么影响?
【发布时间】:2011-03-29 16:04:07
【问题描述】:

在 C 程序中,我看到以下语句:

memcpypgm2ram((void*)&AppConfig.MyMACAddr, (ROM void*)SerializedMACAddress, sizeof(AppConfig.MyMACAddr));

(void*) case 有什么作用? 这是为 Microchip C30 编译器编写的。

AppConfig 是这样定义的:

APP_CONFIG AppConfig;  // APP_CONFIG is obviously a structure...

SerializedMACAddress 是这样定义的:

static ROM BYTE SerializedMACAddress[6] = {MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3, MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6};

编辑:我应该在之前说明这一点,但 memcpypgm2ram 被定义为: #define memcpypgm2ram(a,b,c) memcpy(a,b,c)

基本上,void *memcpy(void *dest, const void *src, size_t n);

【问题讨论】:

  • memcpypgm2ram 的完整原型是什么?

标签: c pointers casting void


【解决方案1】:

void* 是通用数据指针类型,当用作参数类型时,表示函数在“裸”内存块上工作。它不能被取消引用。

任何其他数据指针类型都可以隐式转换为void*,因此显式转换可能是错误的(不必要的),或者是编译器损坏的解决方法,或者是转换为unsigned char *的简写(在这种情况下这是一个解决接口损坏的方法)。

【讨论】:

    【解决方案2】:

    演员void * 将某种类型的指针转​​换为通用指针。

    【讨论】:

      【解决方案3】:

      memcpypgm2ram 函数不需要特定类型。它应该使用以下原型定义:memcpypgm2ram(void* p1, void* p2, int n); "void *" 是一个泛型指针类型的转换。

      该函数只需要两个任意类型的指针并将 n 个字节(在您的情况下为 n=sizeof(AppConfig.MyMACAddr))从一个地址复制到另一个地址。

      【讨论】:

        【解决方案4】:

        memcpypgm2ram 大概需要一个 void 指针作为它的参数。 C 的类型足够强,可以识别 &AppConfig.MyMACAddr 的类型是 (MACAddr*),如果您不将其转换为 void*,则会发出编译时错误。

        关键是 memcpypgm2ram 是一个对内存中保存的任何字节起作用的函数,因此它不会接受强类型指针作为参数。

        【讨论】:

        • 如果转换为void* 使编译器发出错误,则编译器已损坏。
        【解决方案5】:

        在这种情况下,可以使用强制转换为 (void *) 来消除编译器的警告。

        【讨论】:

        • 破碎编译器的警告,即。
        【解决方案6】:

        如果没有看到更多上下文(memcpypgm2ram 是如何声明的?),就无法说出在这种特定情况下使用 (void *) 转换的意义何在。

        在 C 语言(以及 C++)中,指针类型可以隐式转换为 void * 类型,这意味着在指针转换中通常没有理由使用显式转换为 void * 类型。看起来在您的示例中所有转换都是指针转换,因此,考虑到我所说的,不需要显式转换为 void *

        另一种可能性是原始指针类型是 const 限定的,因此转换为 void * 用于删除 const 限定。但是,我在您提供的内容中看不到任何 const 限定,这再次意味着,很可能不需要强制转换为 void *。我的猜测是,无论是谁把它放在那里都是“以防万一”,没有真正的理由。

        简而言之,(void *) 转换将指针转换为 void * 类型。但由于无论如何这种转换都会隐式发生,因此完全没有必要进行强制转换(假设 memcpypgm2ram 是用 void * 参数声明的)。

        【讨论】:

          猜你喜欢
          • 2013-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多