繁体   English   中英

将动态内存分配给结构数组

[英]Allocating dynamic memory to a Structures Array

我正在尝试回答我有要求“ 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不存在合适的构造函数来从“坐标*”转换为“坐标”

大概

 coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n)); 

必须替换为

coordinates * cordArray = (coordinates *)malloc(sizeof(coordinates) * n);

因为您用coordinates *分配了一个coordinates ,并且cordArray是未知的,甚至它也可能无法转换为size_t (您未提供其定义)


顺便说一句,您在C ++中,为什么要使用C数组,您可以通过新方法对其进行分配,从而允许为每个条目调用坐标的构造函数,或者更好地使用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

@bruno已经显示了使用malloc分配内存的正确方法。 但是,这可以在操作员new[]帮助下更简单地完成,该操作符自动计算所需的内存量。

coordinates *cordArray = new coordinates[n];

要释放内存,请使用运算符delete[]

delete[] cordArray;

C ++分配方式的另一个优点是,它为新创建的对象调用构造函数。 (如果有任何构造函数,那就是。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM