【问题标题】:Why do I get "assigning to 'int *' from incompatible type 'void *' " error?为什么会出现“从不兼容的类型 'void *' 分配给 'int *'”错误?
【发布时间】:2019-12-20 22:47:03
【问题描述】:

我在 codeacademy 上学习 c,我得到一个 assigning to 'int *' from in compatible type 'void *' 错误。我的文件是一个 .c 文件,其中包括 stdlib.h。我不明白错误,似乎更正使用了相同的代码行。

我正在尝试使用 malloc 创建一个数组。

我试图找到其他主题的答案。似乎 malloc 不是最好的方法,但我想找到一种方法让它工作。

我在mac上,我用emacs编码,gcc编译。

这是我的代码的一部分:

int main(int argc, char *argv[])
{
  char mot_secret[] = "PISCINE";
  int nombre_lettres = strlen(mot_secret);
  int *pnombre_lettres = &nombre_lettres;
  int *decouverte = NULL;
  int compteur = 10;

  decouverte = malloc(nombre_lettres * sizeof(int));
  if (decouverte == NULL)
    {
      exit(0);
    }

这是解决方案: (我试图翻译一些变量)

int main(int argc, char* argv[])
{
    char lettre = 0;
    char secretword[100] = {0};
    int *lettreTrouvee = NULL; 
    long coupsRestants = 10; // Compteur de coups restants (0 = mort)
    long i = 0;
    long wordSize = 0;

    wordSize = strlen(secretWord);

    lettreTrouvee = malloc(tailleMot * sizeof(int)); // creates a dynamic array of the size of the original)
    if (lettreTrouvee == NULL)
        exit(0);

错误是:

TP.C:17:16: error: assigning to 'int *' from incompatible type 'void *'
  decouverte = malloc(nombre_lettres * sizeof(int));

非常感谢您的帮助,如果我在英语中有任何错误,我很抱歉。

【问题讨论】:

  • 也许你是用 C++ 编译器而不是 C 编译器来编译它。
  • 非常感谢您的快速答复。我这样编译我的文件:gcc -o tp tp.c

标签: c gcc


【解决方案1】:

您的文件名似乎是TP.C

在unix传统中,C源文件被命名为*.c(小写c),C++源文件被命名为*.C(大写C)。在 Windows 上使用替代的 *.cpp 是因为它不区分大小写的文件系统,但在 MacOS 上的 gcc 非常类似于 unix,它会将您的 *.C 文件视为 C++。

【讨论】:

  • 但是当我在 Finder 中查看时,该文件被称为“TP.c”,但在错误中它被称为“TP.C”并创建它,我做了“emacs TP.c”(小写)。是否有可能它是一个“.C”文件,但查找器将其显示为一个“.c”文件?
  • 您可以通过使用选项-x c 强制gcc 将文件视为C 语言。 (它会覆盖所有源文件名参数的语言自动检测。)
  • @FlorianOry 也许可以找到名称为TP.cTP.C 的文件。编译器命令行使用哪个名称?错误消息暗示它正在编译TP.Cls TP.C 是否显示匹配的文件名? cat TP.C 是否列出文件内容?
  • @FlorianOry,Ian 强制 C 语言模式的建议能解决您的问题吗?如果是这样,那么您当前的两个正面得分答案都是正确的。剩下的问题似乎与您的文件系统的语义有关,最好将这些问题作为一个单独的问题提出(如果您无法通过自己的研究轻松找到答案)。
  • @IanAbbott 和 John Bollinger(我只能标记 1 个人),ls 和 cat 命令显示 TP.c 和 TP.C 的匹配文件。看来 TP.C 是一个隐藏文件。但是当我编译时,我使用了 TP.c 。它在我强制 C 解析模式时起作用。而且我还尝试创建一个具有相同内容的新 tp2.c 文件,我也工作了。我不知道 TP.C 文件是如何创建的,但您的解决方案运行良好。非常感谢您的帮助!!
【解决方案2】:

malloc 返回的类型始终为 void*,可以强制转换为所需的数据类型。

您需要执行以下操作: (int*) malloc(nombre_lettres * sizeof(int));

来源:cplusplus

【讨论】:

  • 您的答案对 C++ 有效,但在 C 中不受欢迎。
  • 嗨玛丽安。这个问题被标记为 [c],而不是 [c++] ...它们是不同的语言,并且有不同的 malloc 使用规则。这实际上是 OP 问题的关键,事实证明这很有趣……请参阅上面 Wumpus Q. Wumbley 的回答下的讨论。
【解决方案3】:

鉴于此错误消息:

TP.C:17:16: error: assigning to 'int *' from incompatible type 'void *'
  decouverte = malloc(nombre_lettres * sizeof(int));

您的文件似乎名为TP.CThe upper-case .C file extension causes GCC to compile the file as C++:

file.cc
file.cp
file.cxx
file.cpp
file.CPP
file.c++
file.C

必须预处​​理的 C++ 源代码。请注意,在“.cxx”中,最后两个 > 必须都是字面上的“x”。 同样,“.C”指的是文字大写 C。

您需要使用小写字母。重命名您的文件,使其以.c 结尾 - 小写c

【讨论】:

  • 感谢您的回答,文件夹中有隐藏文件 TP.C
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多