从void *到char的转换无效**

时间:2009-07-26 20:22:01

标签: c gcc casting malloc

自从我搞砸C代码以来已经有一段时间了。

使用gcc在Ubuntu下编译C代码时出现以下错误。

我用来编译代码的命令是(如果这些错误是因为我正在使用的编译器,请告诉我如何让它消失):

gcc -o runnable mycode.C 
  

错误:从'void *'无效转换为'char **'

第39行是:

sequence=malloc(sizeof(char *)*seqNum);

序列声明为:

char **sequence;

seqNum声明为:

int seqNum

2 个答案:

答案 0 :(得分:7)

已添加:Arron实际问题的最快解决方案是由sgm在评论中提供的。下面的文字都是准确的,希望是有帮助的,但是对于手头的问题是第二种解决方案。


您的编译器在指针转换方面非常僵硬(您使用的是c ++编译器吗?),添加了一个显式的转换,如

sequence=(char**)malloc(sizeof(char *)*seqNum);

应该让错误消失。或者,您可以通过某种选项(例如

)说服编译器轻松使用您
$(CC) --lighten-up-baby code.c

这可能是更好的,如果这是一些你真的不想破解的第三方代码。阅读编译器文档以找到所需的选项。由于我手头的所有gcc(版本4.0和4.2)都对该代码感到满意,因此我无法提供有关开关的建议以解决此问题。

答案 1 :(得分:5)

您需要强制转换malloc 的结果才能成为您想要的类型。

所以:

 char **sequence;
 ...
 sequence = (char **)malloc(sizeof(char *) * seqNum);

还要记住,如果你要使用序列,你需要像你一样分配一个“char *”列表,但是你没有分配指向的内存,它只分配了指针列表的空间。

这是一个错误的部分原因是在不同指针类型之间进行分配可以改变所需的对齐方式。 Malloc保证返回一个指向空间的指针,对齐适合任何类型。