gpt4 book ai didi

c - 指向包含数组的结构的指针

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:21 26 4
gpt4 key购买 nike

我有一个简单的结构,其中包含一个整数数组和一个用于该数组的索引。

#define BUFF_SIZE 100
typedef struct _buffer Buffer;

struct _buffer {
int buff[BUFF_SIZE];
int index;
};

我正在尝试编写一个函数来创建指向该结构实例的指针,并将其值初始化为零。但是,当我尝试使用箭头运算符初始化数组时,出现表达式无效的错误。

...
Buffer* newBuff;
newBuff->buff = {0}; //Error occurs here
...

我知道在 c 中,数组是指向数组所在内存块基址的指针,但我的印象是取消引用结构指针将允许我访问数组。我错了吗,还是我在这里遗漏了什么?我有一种感觉,它非常简单,但就我的生活而言,我就是无法发现它。

谢谢!

编辑:感谢你们的快速回答,他们帮助我理解了一些正在发生的事情。我没有提到这是为了在嵌入式系统上运行(对此感到抱歉),所以我想尽可能避免使用 include 或 malloc。

最佳答案

这里有几种类型的混淆。一个指向内存的指针(duh),但您需要从某个地方获取该内存。您如何初始化该内存是独立的。

您可以通过在函数内声明一个局部变量来在堆栈上分配您的结构:

// Initialize all buff elements and index to 0
// Note: Buffer, not Buffer*
Buffer newBuf = { {0}, 0 };

或者你可以在堆上分配它:

Buffer *newBuf = malloc(sizeof(Buffer));
memset(newBuf, 0, sizeof(Buffer));

在堆栈上分配对象时,它们仅在当前函数执行时有效。您不能返回指向堆栈上对象的指针。此外,堆栈空间通常是有限的,因此您不能将兆字节大小的对象放在那里。使用malloc() 在堆上分配内存时,需要注意在不再使用时释放free(),否则会泄漏内存。

您会看到,在堆栈上分配对象时,您可以使用初始化列表 { {0}, 0 } 。在堆情况下,您不能这样做,您必须使用 memset 手动将内存清零。

关于c - 指向包含数组的结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418637/

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