从'void *'类型无效转换为'int *'

时间:2016-11-03 12:34:18

标签: c

已添加2 :更改为static后,它可以在ubuntu上 bash中的gcc 4.8.4(ubuntu 4.8.4-2ubuntu1~14 .04.3)中正常工作窗口即可。 使用gcc 4.9.2(tdm-1)无法在windows10中运行。我将编译器更改为具有gcc 4.9.2的cygwin,而不是tdm-1版本。很奇怪,它的作品!所以我认为编译器也有一些错误!

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

windows 10 elipse gcc 4.8.4 。我使用C语言。

elipse给我一个错误:从'void *'类型无效转换为'int *'[-fpermissive] 类型。

elipse建议这些行有错误

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);
}

3 个答案:

答案 0 :(得分:5)

在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);

答案 1 :(得分:1)

对我而言,您似乎正在将C代码片段移植到C ++(包含在C ++项目中?)。

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

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

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编译器)来编译代码。

另一个选择是将其重写为&#34; real&#34;使用new / delete代替malloc / free的C ++代码,但是你也可以将其重写为使用现代内存管理(如std :: vectors等)。 )。

答案 2 :(得分:0)

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