【问题标题】:Assign a void* variable to a struct variable将 void* 变量分配给结构变量
【发布时间】:2014-08-20 02:49:28
【问题描述】:

我有一个通过套接字连接获得的 void* 变量。我需要将其转换为结构类型,该类型在客户端和服务器端都定义。

我在下面的代码中提供了相关作业的示例。在示例中,为了简洁起见,我省略了网络代码。

#include <stdio.h>
#include <stdlib.h>


typedef struct
{
    int x;
    int y;
} testStructType;


void someFunction(void* p)
{
    //some processing goes here.


}


int main(void) {

    testStructType testStruct;
    void* p;

    p=malloc(sizeof(testStructType));

    someFunction(p);


    testStruct=p;


    printf("%i ,%i",testStruct.x,testStruct.y);

    return EXIT_SUCCESS;
}

问题是我得到错误 从 'void*' 分配给类型 'testStructType' 时类型不兼容

我做错了什么? 有人可以帮帮我吗?

【问题讨论】:

  • 赋值testStruct=p会失败,因为testStruct是一个结构,p是一个通用指针。实际上,您可能根本不需要使用通用指针(即void *)。只需使用指向结构的指针,并尽可能多地使用它。许多套接字接收/发送函数需要char * 来获取数据,然后在需要时将指针转换为结构。如果一个函数需要一个泛型指针,那么根本不需要强制转换。
  • testStruct=p; :与(testStructType) = (void*)不同的类型,改为testStruct=*(testStructType *)p;
  • 当然,套接字两端的程序应该使用相同版本的相同编译器进行编译,使用相同的标志调用,并在相同的操作系统上运行。只需稍作改动即可使两端的结构不兼容。

标签: c sockets struct void-pointers


【解决方案1】:

你是说

testStruct = *(testStructType *)p;

要获取指针指向的内容,您需要取消引用它。

这会复制结构体。如果您实际上不需要副本,则可以直接访问原件:

testStructType *pt = p;
printf("%i ,%i", pt->x, pt->y);

请注意,您不是“通过套接字连接获取 void* 变量”。您正在通过套接字连接获取一些数据,而 void* 变量指向该数据。

【讨论】:

    【解决方案2】:

    这是一个指针,所以读取的行

        testStructType testStruct;
    

    应该阅读

        testStructType *testStruct;
    

    那么下面的代码需要改成:

        testStruct = (testStructType *)p;
    
        printf("%d, %d", testStruct->x, testStruct->y);
    

    【讨论】:

    • 我也使用了那个解决方案,但它仍然给了我一个错误。 @Matt McNabb 提出的解决方案对我有用。无论如何感谢您的支持。
    • 如果 p 的类型为 void*,则不需要强制转换。
    • @alk 虽然从技术上讲确实如此,但如果您尝试在没有适当强制转换的情况下将 void 指针分配给非 void 指针,大多数优秀的编译器都会生成警告。投射是个好习惯。
    • @alastair:您介意为 C 编译器提供任何这样做的示例吗?
    • @alk 好吧,首先,如果您使用的是 C++ 而不是 C,这是一个彻头彻尾的错误。如果您使用的是 C 编译器,通常可以为此打开一个警告选项;例如,GCC 有-Wc++-compat
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2021-03-19
    • 2013-01-21
    相关资源
    最近更新 更多