【问题标题】:invalid cast from type 'void*' to type 'int*'从“void*”类型到“int*”类型的无效转换
【发布时间】:2016-11-03 12:34:17
【问题描述】:

新增2:改成static后,可以在bash on ubuntu on windows。 但是它不能在使用 gcc 4.9.2(tdm-1) 的 windows10 中工作。我将编译器更改为具有 gcc 4.9.2 的 cygwin,而不是 tdm-1 版本。奇怪,它有效!所以我认为编译器也有一些错误!

已添加1:非常抱歉我发现我的编译器是 gcc 而不是 g++,我是程序世界的新手,请见谅。我使用.c 构建,但它有一些我无法处理的内存泄漏错误。所以我改用.cpp来构建,这些错误就出来了。这就是我的情况。

Windows 10 椭圆 gcc 4.8.4。我使用 C 语言。

elipse 给我一个错误:从类型“void*”到类型“int*”的无效转换 [-fpermissive]。

椭圆提示这些行有错误

FullList = malloc(N * sizeof(int));
l = malloc(N * sizeof(int));

我不知道如何纠正它。 任何线索将不胜感激!

这是涉及这句话的函数。

#define ALLCHK(x) if (x == NULL) {printf ("allocation error\n"); assert(x);}
void Generate_Permutation(int N, int *p)
/* generate permutation of length N in p */
/* p is zero based, but the permutation is not */
{
  int i,j;         /* to loop */
  int lspot;         /* offset in l */
  int *FullList;       /* unpermuted */
  int *l;          /* left to be used */

  FullList = malloc(N * sizeof(int));
  ALLCHK(FullList)
  for (i=0; i<N; i++) *(FullList+i) = i+1;
  l = malloc(N * sizeof(int));
  ALLCHK(l)

  memcpy(l, FullList, sizeof(int)*N);
  for (i=0; i < N; i++) {
    lspot = (int)(URan(&seed) * (N - i));
    *(p+i) = *(l+lspot);
    for (j=lspot; j<N-i; j++) *(l+j) = *(l+j+1);
  }
  free(l); free(FullList);
}

【问题讨论】:

  • 错误不是来自 Eclipse(至于编辑器),而是来自编译器。顺便说一句,您是用 C 还是 C++ 编码,它们是 不同的编程语言;而且C++11和C++98有很大的不同
  • C 和 C++ 的规则不同。你用的是哪一个?
  • 作为第一步,您需要决定使用哪种语言,C 或 C++。
  • ALLCHK的定义是什么?
  • @Yu-FengQin 如果你想使用 C 库,你应该包含 。

标签: c


【解决方案1】:

在 C++ 中,void* 不能隐式转换为 int*。您需要显式转换 malloc 的结果:

fullList = static_cast<int*>(malloc(N * sizeof(int)));
l = static_cast<int*>(malloc(N * sizeof(int)));

由于您使用的是 C++,因此最好使用 new 运算符:

fullList = new int[N];
l = new int[N];

// some code...

delete[] fullList;
delete[] l;

在此期间,您可以使用唯一指针:

std::unique_ptr<int[]> fullList = new int[N];
std::unique_ptr<int[]> l = new int[N];

// no delete at the end of the scope

但更简单,只需使用向量:

std::vector<int> fullList(N);
std::vector<int> l(N);

【讨论】:

  • 如果他们使用 C++,为什么不直接使用 new?
【解决方案2】:

对我来说,您似乎正在将 C 代码 sn-p 移植到 C++(以包含在 C++ 项目中?)。

将此答案视为解决问题的快速方法,而不是最佳解决方案。

在 C++ 中使用 malloc/free 时,必须将 malloc 返回的 void* 指针转换为所需的指针类型:

FullList = static_cast<int*>(malloc(N * sizeof(int)));
l = static_cast<int*>(malloc(N * sizeof(int)));

这样做的原因(当简单地复制 C 代码时)是因为在 C 中允许隐式地执行这些强制转换。

其他选项是使用 C 编译器编译该文件,为此只需将文件重命名为 .c 的扩展名而不是 .cpp 就足够了。然后,g++(C++ 编译器)会自动使用 gcc(C 编译器)来编译你的代码。

另一个选择是使用new/delete 而不是malloc/free 将其重写为“真正的”C++ 代码,但是您也可以同样将其重写为使用现代内存管理(像 std::vectors 等)。

【讨论】:

  • 你不应该在 C++ 中使用malloc。您应该使用标准容器和智能指针。
  • 为什么不直接使用new?
  • 我同意。但这是 C++ 项目中的一些 C 代码的 sn-p。我将这种情况与在 C++ 中使用 C 库进行了比较。在那里,我不能简单地说,嘿库,使用 new 而不是 malloc,因为您在 C++ 程序中运行。我猜,OP 希望对移植的代码应用最少的代码更改。那么这里反对使用 malloc 的理由是什么?
  • 感谢您的帮助!我会试试你告诉我的。
【解决方案3】:

在 C 中,您不必强制转换 malloc 的 (void*) 结果。在 C++ 中,编译器会哭,除非你强制转换。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 2012-06-19
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多