【发布时间】:2019-03-15 08:17:47
【问题描述】:
我是 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++ 上运行此代码。我不知道版本和更改编译器的版本。我什至不知道它是否与编译器版本有关。但我想知道为什么我会收到这个错误。背后的逻辑是什么。
【问题讨论】:
-
它是否适用于显式转换,例如
triangle *tr = (triangle*)malloc(n * sizeof(triangle));? -
C 和 C++ 是两种非常不同的语言,具有非常不同的行为和规则。请仅使用您实际编程的语言的语言标签。
-
@Yksisarvinen 他收到错误的原因是因为他使用的是 C++ 编译器。
-
这意味着您正在使用 C++ 编译器来编译 C 代码。不被禁止,但 C 和 C++ 之间的一个不兼容是 C 允许从
void *隐式转换到其他指针类型,而 C++ 不允许。阅读编译器套件的文档,了解如何将代码编译为 C。对于某些编译器套件,您可能需要使用不同的命令/驱动程序。 -
@ibrahimG。 - 它可能有效,但这也意味着您的编译器是 C++ 编译器。 Blaze 的方法在 C 中是不好的做法。如果您打算用 C 编程,更好的解决方案是使用 C 编译器。
标签: c struct type-conversion malloc