我对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。希望每次使用时每个结构都明确声明为一个结构。这实际上可能是我的问题的根源,但我们会看到!
答案 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_delims
与meta_data
配对。
当number_of_delims为64时,我得到一个大约8的数组大小。
没有。你得到的数组大小完全 64,正如你所期望的那样。你的指针不会自动携带大小信息(因为你预期),所以没有可移植的方法来得出你的分配可以存储64个元素的结论。你能得出这个结论的唯一方法是错误地(即试图使用sizeof
,正如我所解释的那样,并不像你期望的那样工作。)< / p>
作为练习,如果你声明一个指向64 struct Points
数组的指针会发生什么呢?
struct Points (*foo)[64] = NULL;
首先,NULL
可以包含多少元素?什么是sizeof foo
和sizeof *foo
?当我说sizeof
评估表达式的类型的大小时,你明白我的意思吗?