在 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 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )