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

6 c malloc gcc casting

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

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

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

gcc -o runnable mycode.C 
Run Code Online (Sandbox Code Playgroud)

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

第39行是:

sequence=malloc(sizeof(char *)*seqNum);
Run Code Online (Sandbox Code Playgroud)

序列声明为:

char **sequence;
Run Code Online (Sandbox Code Playgroud)

seqNum声明为:

int seqNum
Run Code Online (Sandbox Code Playgroud)

dmc*_*kee 7

补充: Arron实际问题的禁食解决方案由sgm在评论中提供.下面的文字都是准确的,希望是有帮助的,但是对于手头问题的第二速率解决方案.


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

sequence=(char**)malloc(sizeof(char *)*seqNum);
Run Code Online (Sandbox Code Playgroud)

应该让错误消失.或者你可以用一些选项来说服编译器轻松上手

$(CC) --lighten-up-baby code.c
Run Code Online (Sandbox Code Playgroud)

如果这是一些你真的不想破解的第三方代码,这可能是更好的选择.阅读编译器文档以找到所需的选项.由于gcc我手头的所有内容(版本4.0和4.2)都对该代码感到满意,因此我不太适合提供有关交换机的建议以关闭此行为.

  • 完全+1.C编译器不抱怨,但C++编译器应该. (2认同)

Dav*_*ner 5

您需要将malloc的结果转换为您想要的类型.

所以:

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

还要记住,如果你要使用序列,你需要像你所做的那样分配一个"char*"列表,但是你没有分配指向的内存,它只分配了空间用于指针列表本身.

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

  • 是的,不,不是. (7认同)
  • 这仅适用于C++.海报认为他正在编写一个不太严格的C应用程序. (2认同)
  • C和C++的最佳实践与malloc()不同; 在C中,最好*不*来转换结果,因为如果在范围内没有malloc()的原型(这比你想象的更频繁),这样做会掩盖警告. (2认同)