mallocing结构数组创建的数组太小

时间:2017-02-20 02:54:09

标签: c arrays pointers struct

我对C中的结构有点新,我在创建存储它们的数组时遇到问题。正如标题所说,当我尝试malloc输出一个结构数组时,我的数组最终会变得非常小。

这是我的结构:

struct Points
{
  char file_letter;
  char *operation;
  int cycle_time;
};

以下是我尝试创建数组的方法:

struct Points *meta_data;
meta_data = malloc(number_of_delims * sizeof(struct Points));

number_of_delims是一个int,表示我尝试创建的点数,因此表示我的数组中的元素数。

当number_of_delims为64时,我得到一个大约8的数组大小。

注意:这或多或少是一个学校项目,我在将结构声明为教授时不能使用typedef。希望每次使用时每个结构都明确声明为一个结构。这实际上可能是我的问题的根源,但我们会看到!

1 个答案:

答案 0 :(得分:2)

struct Points *meta_data;

此时,我们声明了一个对象meta_data,它具有类型struct Points * ...和struct Points *,是一种指针类型,在常见实现上通常需要8个字节。这可以通过以下程序观察到:

#include <stdio.h>
struct Points;
int main(void) {
    struct Points *meta_data;
    printf("sizeof meta_data: %zu\n", sizeof meta_data);
}

请记住,sizeof运算符会计算表达式的类型的大小,在本例中为指针。指针不包含有关其指向的阵列的大小信息。你需要保持这一点(例如,如果你以后需要这两个值,最好将number_of_delimsmeta_data配对。

  

当number_of_delims为64时,我得到一个大约8的数组大小。

没有。你得到的数组大小完全 64,正如你所期望的那样。你的指针不会自动携带大小信息(因为你预期),所以没有可移植的方法来得出你的分配可以存储64个元素的结论。你能得出这个结论的唯一方法是错误地(即试图使用sizeof,正如我所解释的那样,并不像你期望的那样工作。)< / p>

作为练习,如果你声明一个指向64 struct Points数组的指针会发生什么呢?

struct Points (*foo)[64] = NULL;

首先,NULL可以包含多少元素?什么是sizeof foosizeof *foo?当我说sizeof评估表达式的类型的大小时,你明白我的意思吗?