在将void *转换回String时遇到一些麻烦

时间:2016-04-20 20:16:48

标签: c string pointers casting void-pointers

当我尝试运行以下代码时,程序崩溃:

#include <string.h>
#include <stdio.h>

typedef char* String;

int main() {
    char string1[] = "hello";
    void* try = &string1;
    String try2 = *(String*)try;
    printf("%s ",try2);
}

任何想法为什么?

5 个答案:

答案 0 :(得分:2)

String try2 = *(String*)try;

相当于

char* try2 = *(char**)try;

这可能与您的意图相冲突。你应该写

String try2 = try;

或只是

char *try2 = try;

另请注意,强制转换可以隐藏严重问题,因此在不必要时应避免使用它们。

答案 1 :(得分:1)

在您的代码中,

 String try2=*(String*)try;

错了。您可以摆脱不必要的(有害的)强制转换(实际上隐藏了不匹配的数据类型的问题)并简单地写

 String try2 = try;

答案 2 :(得分:0)

您可以使用

try=&string1[0];

try=string1;

答案 3 :(得分:0)

String try2=*(String*)try;

错了。

你可以拥有

String try2=(String)try;

String try2=try; // Recommended style, since a void* can be safely cast into any other pointer type.

答案 4 :(得分:0)

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> <move element="catalog.leftnav" destination="category.products" after="-"/> </layout> 的类型是string,它是char[6]的数组,你可以将它指向一个字符指针:

char

char* p = string; 的类型为&string。它是指向6 char(*)[6]数组的指针,因此您无法将其分配给charchar**是指向char指针的指针。您需要将其指定给指向6个字符数组的指针:

char (*pa)[6] = &string;

因此你在这里做的演员:

(String*)try;

相当于:

( char**)try 

不正确,因为try表示指向6个char数组的指针,而不是指向char的指针。

指针应该转换为正确的类型,指向6 char的数组的指针:

String* try2 = *( char(*)[6] )try;