gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:11:01 25 4
gpt4 key购买 nike

我对 C 中的结构有点陌生,并且在创建数组来存储它们时遇到问题。正如标题所说,当我尝试分配一个结构体数组时,我的数组最终变得太小了。

这是我的结构:

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,表示我尝试创建的 Point 数量,以及数组中的元素数量。

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

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

最佳答案

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 配对)。

<小时/>

With number_of_delims being 64 I get an array size of about 8.

没有。正如您所期望的,您得到的数组大小恰好为 64。您的指针不会自动携带该大小信息(因为您希望这样做),因此没有可移植的方法可以得出您的分配可以存储 64 个元素的结论。您得出此结论的唯一方法是错误(即尝试使用sizeof,正如我所解释的那样,它无法按您的预期工作)。

<小时/>

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

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

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

关于c - mallocing 结构数组创建的数组太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42335737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com