我正在尝试回答作业,我有需要询问“ n”个坐标的地方,然后构建具有该大小的结构坐标数组。 每个坐标结构都有两个来自double类型的变量。
我尝试从用户处获取n的输入,并通过if语句检查其输入,然后先大于0以避免任何失败
printf("Enter amount of coordinates:\n");
scanf_s("%d", &n);
if (n > 0) {
coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));
}
预期是在从用户获得n值之后,将正确的大小分配给structs数组。 我得到的错误是 “严重性代码描述项目文件行抑制状态 错误(活动)E0415不存在合适的构造函数,无法从“坐标*”转换为“坐标”
答案 0 :(得分:2)
可能
coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));
必须替换为
coordinates * cordArray = (coordinates *)malloc(sizeof(coordinates) * n);
因为您为coordinates
分配了coordinates *
,并且cordArray
是未知的,甚至是size_t
也可能无法转换为{{1 )
顺便说一句,您在C ++中,为什么要使用C数组,您可以通过 new 对其进行分配,从而允许为每个条目或更佳的条目调用 coordinates 的构造函数使用std::vector
允许更改大小,访问大小等
关于您的评论,该程序将编译并运行:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double x;
double y;
}coordinates;
int main()
{
printf("Enter amount of coordinates:\n");
int n;
if (scanf("%d", &n) != 1)
puts("invalid number");
else if (n <= 0)
puts("expected a positive number");
else {
coordinates * cordArray = (coordinates *) malloc(sizeof(cordArray) * n);
if (cordArray == NULL)
printf("cannot allocate memory, probably %d too large\n", n);
else {
int i;
for (i = 0; i < n; i++) {
printf("Please enter coordinates for coordinates #%d:\n", i + 1);
if (scanf("%lf%lf", &cordArray[i].x, &cordArray[i].y) != 2){
puts("invalid values");
return -1;
}
}
}
}
}
请注意,这是C代码,为什么要使用标签C ++?
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
Enter amount of coordinates:
2
Please enter coordinates for coordinates #1:
1 2
Please enter coordinates for coordinates #2:
3 4
答案 1 :(得分:0)
@bruno显示了使用malloc
分配内存的正确方法。
但是,这可以在操作员new[]
的帮助下更简单地完成,该操作符会自动计算所需的内存量。
coordinates *cordArray = new coordinates[n];
要释放内存,请使用运算符delete[]
。
delete[] cordArray;
C ++分配方式的另一个优点是它为新创建的对象调用构造函数。 (如果有的话,就是这样)。