C:struct的sizeof struct,以查找struct中的元素数

问题描述

我有两个结构:

struct point {
  double x;
  double y;
  const char *description;
};

struct geomap {
  struct point points[];
};

假设我将x点添加到新地图中。我如何从sizeof开始获得那个数字x?还是有其他方法可以知道我在新地图中添加了多少点?我需要一个循环来删除点并做其他事情,但是我无法弄清楚元素的数量。

我尝试过

sizeof(m->points[])/sizeof(m->points[0])

但是它说:ERR期望表达 如果您想更快地玩一些代码:

static int counter = 0;

struct geomap *geomap_new() {
  struct geomap *a_geomap = (struct geomap *)malloc(sizeof(geomap));
  if (!a_geomap)
    exit(0);
  struct point *a_point = (struct point *)malloc(sizeof(point));
  if (!a_point)
    exit(0);
  return a_geomap;
}

int geomap_add_point(struct geomap *m,double x,double y,const char *descr) {
  m->points[counter].x = x;
  m->points[counter].y = y;
  m->points[counter].description = descr;
  counter++;
  if (!m) {
    printf("failed to allocate new point");
    return 0;
  }
  return 1;
}

int main() {
  struct geomap *m = geomap_new();
  geomap_add_point(m,10324,2341213.2,"212222");
  geomap_add_point(m,103212,221341.2,"21wdd2");
  geomap_add_point(m,103241,2.2,"2213122");
  geomap_add_point(m,1034123,23341.2,"1111");
  geomap_add_point(m,1000324213,23234242341.2,"dediowd");

  return 1;
}

解决方法

首先,您应该考虑数组是否是用于此容器的正确数据类型。如果您打算频繁添加/删除项目,则链表或图形可能更合适。

对于@echo on set /p NAME=Enter the NAME : echo Your name is %NAME% ,这是所谓的 flexible array member 。它只能放置在结构的末端,并且该结构需要在其旁边有其他成员。灵活的数组成员将被视为不完整类型的数组,因此不能在其上使用struct point points[];,因为在编译时不知道大小。您必须手动跟踪尺寸。

正确使用将是这样的:

sizeof

也就是说,您可以一次性为对象和灵活数组分配内存。

,

在此示例中,结构中始终有0点。

尽管该结构中有0个点,但是您的代码会写入第1,第2,第3,第4和第5个点,因此会覆盖一些不属于您的内存。

因此,您可以使用数字0来获得点数。

如果您想分配其中包含一些点的地图,可以这样做:

struct geomap *a_geomap = (struct geomap *)malloc(sizeof(geomap) + NUMBER_OF_POINTS*sizeof(point));

由您决定如何存储NUMBER_OF_POINTS。例如,您可以决定始终为10。或者,您可以在int上添加另一个struct geomap来存储数字。

请注意,数组创建后无法调整大小。曾经。

,

首先,这不是一个可重复的最低示例。

您有一些错误/打字错误。

错误1:

/* ... */
struct geomap *a_geomap = (struct geomap *)malloc(sizeof(geomap));
/* ... */
struct point *a_point = (struct point *)malloc(sizeof(point));
/* ... */

您要在地理地图中分配点数组,对吗?参见malloc(/*size in bytes*/)。猜猜这段代码应该是这样的:

int i = 0;
/* ... */
struct geomap *a_geomap = (struct geomap *)malloc(sizeof(struct geomap));
a_geomap->points = (struct point *)malloc(sizeof(struct point) * /* Maximum number of points here */ )
/* ... */

错误2:

int geomap_add_point(struct geomap *m,double x,double y,const char *descr) {
  m->points[counter].x = x;
  m->points[counter].y = y;
  m->points[counter].description = descr;
  counter++;
  if (!m) {
    printf("failed to allocate new point");
    return 0;
  }
  return 1;
}

您应在此处检查是否超出了阵列的大小。否则,您可能会收到SIGSEGV(分段故障)。应该是这样的:

int geomap_add_point(struct geomap *m,const char *descr) {
  if (!m) {
    printf("No geomap!!!");
    return -1;
  }
  // Here check for size
  if (counter >= /* Maximum number of points here */) {
    printf("No space for new point!!!");
    return -1;
  }
  m->points[counter].x = x;
  m->points[counter].y = y;
  m->points[counter].description = descr;
  ++counter;
  return 0;
}

最后...

警告1:

您应该考虑通常的做法,通常我们在出错时从函数负值返回,而在成功时从函数返回。

P.S。简短的答案:如果您有静态数组,那么count = (sizeof(/*array*/) / sizeof(/*element type*/))应该可以工作。 但是! 这将对动态数组进行更新。仅动态数组cound = /*Number of elements*/

示例:

/* For static array: */

#define MAX_ARR_T_DATA_SIZE 100
/* ... */
struct arr_t {
  int data[MAX_ARR_T_DATA_SIZE];
};
/* ... */
arr_t array;
int count = sizeof(struct array) / sizeof(int);


/* For dynamic array: */

#define MAX_ARR_T_DATA_SIZE 100
/* ... */
struct arr_t {
  int* data;
};
/* ... */
arr_t array;
array.data = (int*)malloc(sizeof(int) * MAX_ARR_T_DATA_SIZE);
int count = MAX_ARR_T_DATA_SIZE;

P.P.S。我也建议您阅读有关动态数组的内容。例如: http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/2-C-adv-data/dyn-array.html

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...