为什么 Codeblocks 运行 这个 C 程序没有错误,但 Codeforces 显示编译错误?

How come Codeblocks run this C program without errors but Codeforces show compilation error?

以下代码在我的代码块应用程序中使用时运行良好。但是,当通过提交相同的代码解决 Codeforces 中的 "Even Odds" 问题时,它给我一个编译错误。

Error:invalid conversion from 'void*' to 'long long int*' [-fpermissive]

我对 C 编程还很陌生。所以,请帮助我如何修复我的这段代码。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
long long *arr, n, k, i, n1, n2, m;
scanf("%I64d%I64d", &n, &k);
arr=malloc(sizeof(long long)*n);
    n1=1;n2=2;
for(i=0;i<=n/2&&n1<=n;i++){
    arr[i]=n1;
    n1+=2;
    }
if(n%2!=0) m=n/2+1;
else m=n/2;
for(i=m;i<=n&&n2<=n;i++){
    arr[i]=n2;
    n2+=2;
    }
printf("%I64d", arr[k-1]);
free(arr);

return 0;
}

在 Codeblocks 中,您必须将其编译为 c 文件。但是在 Codeforces 中,代码被编译为 cpp。

arr=malloc(sizeof(long long)*n);

当你在 C 中编译该行时,malloc 将抛出一个 void* 的指针,该指针将自动转换为 long long*

但是cpp的话,需要进行显式转换。到运行 cpp中的代码:

arr = (long long*)malloc(sizeof(long long) * n);

这样就可以了。 阅读 this 文章以了解清楚。