在 C 中声明指向结构的指针数组,但在需要之前不为结构分配内存

Posted

技术标签:

【中文标题】在 C 中声明指向结构的指针数组,但在需要之前不为结构分配内存【英文标题】:Declaring an array of pointers to structures in C, but not allocating memory for structure until needed 【发布时间】:2021-04-04 09:54:13 【问题描述】:

我正在尝试为 n 指针数组分配空间,该指针指向 C 中名为 base 的结构。除非需要,否则我不想为结构分配空间。

如果在用户会话期间需要多个 n 结构,那么我将 realloc 另一组 n 指针。

您能否告诉我这是否是声明它们的正确方法,不包括任何重新分配?

我要问的一个原因是,我不明白为什么 printf("%d", sizeof(ptr[0])) 在分配任何内存之前返回 sizeof(base) 对于base 的实例。

仅仅是因为它是一个指向base的指针,会占用那么多空间吗?

我只是想确保在需要之前没有为 n 基础结构分配空间。

/* Global declaration */
struct base  ... ;
struct base *ptr;

/* in main() */
ptr = calloc( n, sizeof ( char ) );

/* Function to return pointer to newly allocated struct base */
struct base *base_alloc( void )

    return ( struct base * ) malloc( sizeof ( struct base ) );


/* Within a function to create new base and populate it.*/
ptr[i] = base_alloc();

【问题讨论】:

这能回答你的问题吗?:sizeof() 运算符是在编译时计算的。不评估表达式。它是计算的表达式的类型。来自:***.com/q/7788508/1606345? sizeof x 为您提供x 占用的内存量 为什么在这里使用char 的大小:...= calloc(n, sizeof( char )) @alk 因为我错了,一定是误解了我使用的图书示例。 【参考方案1】:

我会澄清几件事:

我不明白为什么 printf("%d", sizeof(ptr[0])) 在为 base 实例分配任何内存之前返回 sizeof(base)。

这是因为sizeof 在编译时计算表达式类型对象占用的字节数。例如。这里的表达式ptr[0] 的类型为struct base,所以sizeof 返回表示struct base 对象所需的字节数。这与内存分配无关。

至于你的其余代码:

您希望ptr 具有struct base ** 类型。 您也不想使用calloc,因为不能保证NULL 指针实际上所有位都设置为零。 最后,不用强制转换malloc返回的值了。

总之:

/* Global declaration */
struct base  ... ;
struct base **ptr;

/* in main() */
ptr = malloc( n * sizeof *ptr );
for (size_t i = 0; i < n; ++i)

  ptr[i] = NULL;


/* Function to return pointer to newly allocated struct base */
struct base *base_alloc( void )

  return malloc( sizeof ( struct base ) );


/* Within a function to create new base and populate it.*/
ptr[i] = base_alloc();

【讨论】:

不需要castmalloc返回的值 你知道你可以建议编辑而不是离开 cmets,对吧? @Peter,超过了相对较低的代表阈值,我们只是执行编辑,实际上 不能 只是建议它们。我认为我对别人的答案非常犹豫不决并不罕见。当然,人们可以很容易地观察到,评论反而是完全例行公事。此外,我倾向于认为 cmets 比编辑更能提供信息——但这并不是说答案应该由其 OP 未经编辑。 谢谢。你介意解释一下为什么它是 struct base **ptr 而不是 *ptr 吗? 反正我学到了很多,没有 **ptr 就无法编译,因为它不能将指针设置为 NULL。我无法理解这与堆栈内存结构基 *ptr[n] 之间的区别。

以上是关于在 C 中声明指向结构的指针数组,但在需要之前不为结构分配内存的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

如何在C中释放指向结构的指针数组?

C ++在指向结构的指针中访问类数组指针

结构指针函数中未声明的变量 c

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]

指针——指向内存地址的变量