如何在 C 中将 void 指针转换为 char 指针

Posted

技术标签:

【中文标题】如何在 C 中将 void 指针转换为 char 指针【英文标题】:How do you convert void pointer to char pointer in C 【发布时间】:2011-10-27 10:20:36 【问题描述】:

好的,这对我来说太令人困惑了。我只是不知道这个作业有什么问题:

void *pa; void *pb;
char *ptemp; char *ptemp2; 

ptemp = (char *)pa;
ptemp2 = (char *)pb;

谁能告诉我为什么会出现这个错误:

错误:从‘void*’到‘char*’的无效转换

【问题讨论】:

此代码不会产生任何错误(假设上下文正确)。这些转换没有任何无效。像这样的错误通常是为 C++ 中的 ptemp = pa 赋值生成的(即没有强制转换,C++ 编译器)。您声称正在使用 C 编译器,并且在那里进行了显式转换。你的情况不会有这样的错误。请发布真实代码。 什么编译器?它是 C 编译器,而不是 C++ 编译器吗?照原样,您所拥有的是合法的 C 并且将通过 gcc 在 C99 标准模式下没有任何问题。 现在这是一个奇怪的错误信息... 这个错误可能是因为这个赋值语句出现在全局作用域而不是函数中。 @Vlad Lazarenko:这可能会触发一个非常不同的错误消息。 【参考方案1】:

实际上,您的编译器一定有问题(或者您没有说出完整的故事)。将void* 转换为char* 是完全合法的。此外,转换在 C 中是隐式(与 C++ 不同),即以下内容也应该编译

 char* pChar;
 void* pVoid;
 pChar = (char*)pVoid; //OK in both C and C++
 pChar = pVoid;        //OK in C, convertion is implicit

【讨论】:

我正在使用 g++ 编译器,我已经在 windows visuall c++ 上编译了代码,没有问题,但是使用 g++ 我得到了这个错误 Armen,我只关心 C,但是当将 char ** 传递给以 void ** 作为参数的函数时,GCC 给了我一个 -Wincompatible-pointer-types,所以它是隐式的仅适用于单个指针? @APJo:当然,看T*可以转换成void*。如果将T 设置为char*,您将看到char** 可以隐式转换为void*,但不能转换为void** @ArmenTsirunyan 我不清楚。我需要这是void ** ... @APJo:为什么你需要它成为void**,你打算用它做什么?【参考方案2】:

我刚刚在一个名为 temp.c 的模块中尝试了您的代码。我添加了一个名为 f1 的函数。

void *pa; void *pb;
char *ptemp; char *ptemp2;

f1()

        ptemp = (char *)pa;
        ptemp2 = (char *)pb;

在 Linux 上,我输入了 gcc -c temp.c,编译后没有错误或警告。

您在哪个操作系统上尝试此操作?

【讨论】:

我使用 g++ 作为编译器,而不是 gcc。也许 gcc 对此有问题?

以上是关于如何在 C 中将 void 指针转换为 char 指针的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 C 中将 char[] 转换为 char*?

关于在 C 中将 `void *` 转换为 `int` 的问题

在 C++ 中将指针转换为 volatile void**

如何在C中将char转换为整数? [复制]

void Test::printxy(void)' : 不能在 const 类中将 'this' 指针从 'const Test' 转换为 'Test &'

从 void 指针转换为 char 指针时遇到问题