将Void指针强制转换为Struct

将Void指针强制转换为Struct,c,pointers,memory,C,Pointers,Memory,假设我们有一个结构“message\t”: 如果函数返回空指针,我们可以简单地将地址分配给msg,还是需要强制转换指针 void *data; msg = data; 我见过“数据”被强制转换为消息\u t的情况,但是这似乎不是完全必要的,那么在什么情况下您会这样做 当然,指针类型(message_t)应该足以告诉编译器如何取消引用指针(即结构中的第一个变量需要多少字节,等等) 如果我的问题不清楚,请告诉我。您不需要抛出空指针,但如果您愿意,也可以,即为了清晰起见。以下简单示例说明了这一点:

假设我们有一个结构“message\t”:

如果函数返回空指针,我们可以简单地将地址分配给msg,还是需要强制转换指针

void *data;
msg = data;
我见过“数据”被强制转换为
消息\u t
的情况,但是这似乎不是完全必要的,那么在什么情况下您会这样做

当然,指针类型(message_t)应该足以告诉编译器如何取消引用指针(即结构中的第一个变量需要多少字节,等等)


如果我的问题不清楚,请告诉我。

您不需要抛出空指针,但如果您愿意,也可以,即为了清晰起见。以下简单示例说明了这一点:

void* data = malloc(32);
char* msg  = data;
strcpy(msg, "Testing.");

如果不取消对指针的引用,则无法将指针强制转换到结构中。您可以将其强制转换为指向结构的指针(
message\t*
)。但是强制转换实际上做了什么?您不能将一个类型指针强制转换为另一个类型指针。您是如何获得
void*
?阅读并提供一个例子。在动态内存分配的背景下,您可以看到这个讨论的一个变体,可以说我并不完全同意这个论点,但是来自
void*
的强制转换被广泛认为是“不必要的,可能有害的”(我认为它们更像是“不必要的,可能有益的”).好了,这开始有意义了!你能详细解释一下为什么你真的想投这部电影吗?我想我的困惑来自于这样一个事实:它似乎是不必要的;双*b=&a;甚至认为我可能会得到意想不到的结果。@user3163179您的注释示例是
int*
double*
-在C中没有定义行为。这个好的答案是
void*
malloc()
char*
-这没关系。@user3163179:我是尽可能避免使用强制转换的人之一。根据我的经验,铸造可以隐藏那些很难找到的虫子。如果您得到编译器警告或错误,而这些警告或错误会随着强制转换而消失,请确保在进行强制转换之前了解原因。然而,有时铸造是有帮助的。例如,将数据发送到USB的函数可能采用字节指针和大小作为参数。您需要强制转换您想要发送的内容(如果它还不是该类型)。类似于这样的内容:发送数据((uint8_t*)&some_struct,sizeof(some_struct))@user3163179:这要看情况。我在很多汇编程序中工作过,它们都是不同的,但都可以理解不同的格式10,啊,1010b,等等。同一处理器的不同编译器可以以不同的方式处理它。
void* data = malloc(32);
char* msg  = data;
strcpy(msg, "Testing.");