我是C语言的初学者。我正在尝试练习解决一些问题。而且在编译代码时遇到此错误。
[错误]从'void *'到'triangle *'的无效转换[-fpermissive]
代码和用途如下所述。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct triangle
{
int a;
int b;
int c;
};
typedef struct triangle triangle;
//sort_by_area() function is here
int main()
{
int n;
scanf("%d", &n);
triangle *tr = malloc(n * sizeof(triangle));
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &tr[i].a, &tr[i].b, &tr[i].c);
}
sort_by_area(tr, n);
for (int i = 0; i < n; i++) {
printf("%d %d %d\n", tr[i].a, tr[i].b, tr[i].c);
}
return 0;
}
如您所见,我具有结构,并且尝试使用输入量为其分配内存。并尝试将其用于sort_by_area
函数。但是问题是triangle *tr = malloc(n * sizeof(triangle));
行给了我上面提到的错误。
此代码也可用于在线编译器。我尝试使用默认设置在 DEV C ++ 上运行此代码。我不知道编译器的版本和更改版本。我什至不知道它是否与编译器版本有关。但我想知道为什么会出现此错误。背后的逻辑是什么?
答案 0 :(得分:8)
这看起来像C代码,但是您正在使用C ++编译器进行编译。因此,它在您提到的行上抱怨,因为malloc
返回了void *
,但是您正在将结果分配给triangle *
。
在C ++中,为此需要显式强制转换。在C语言中,void *
可以隐式转换为任何对象指针类型或从任何对象指针类型隐式转换。
由于这似乎是C代码而不是C ++代码,因此应使用C编译器进行编译。
答案 1 :(得分:2)
您将此程序编译为C ++程序,并且C ++不允许这种隐式转换。
据我所知,开发C ++使用MinGW,您可以使用-xc选项将程序编译为C程序,或者使用设置->语言标准->并选择所需的语言标准
答案 2 :(得分:2)
代码看起来像C代码,但是您正在使用C ++编译器对其进行编译。
确保文件具有C ++的正确扩展名(而不是.c扩展名)。
malloc()默认情况下返回一个(void *)
指针,因此您必须在代码中将(void *)
强制转换为(triangle *)
。
因此,为了避免复杂性,请在C ++中使用new和delete。
C语言中的代码应类似于(文件a.c)
使用gcc a.c -o a.o
进行编译
使用:./a.o
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct triangle {
int a;
int b;
int c;
};
typedef struct triangle triangle;
int main() {
int n;
scanf("%d", &n);
triangle *tr = (triangle *)malloc(n * sizeof(triangle));
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &tr[i].a, &tr[i].b, &tr[i].c);
}
//sort_by_area(tr, n);
for (int i = 0; i < n; i++) {
printf("%d %d %d\n", tr[i].a, tr[i].b, tr[i].c);
}
free(tr);
return 0;
}
C ++中的相同代码看起来像(文件a.cpp)
使用g++ a.cpp -o a.o
进行编译
使用:./a.o运行
#include <iostream>
using namespace std;
struct triangle {
int a;
int b;
int c;
};
int main() {
int n;
cin >> n;
triangle *tr = new triangle[n];
for (int i = 0; i < n; i++) {
cin >> tr[i].a >> tr[i].b >> tr[i].c;
}
// sort_by_area(tr, n);
for (int i = 0; i < n; i++) {
cout << tr[i].a << " " << tr[i].b << " " << tr[i].c << "\n";
}
delete [] tr;
return 0;
}
答案 3 :(得分:0)
triangle *tr = (triangle*)malloc(n * sizeof(triangle));
如上所示更改行。 malloc返回通用指针,因此您需要将其显式转换为所需的指针。