已添加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);
}
答案 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 ++中,编译器会哭,除非你强制转换。