我有一个简单的结构,包含一个int数组和一个用于该数组的索引。
#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中,数组是一个指向数组所在的内存块基址的指针,但结果是取消引用struct指针可以让我访问数组。我错了,或者我错过了什么?我觉得这很简单,但对于我的生活,我无法发现它。
谢谢!
编辑:感谢快速回答的人,他们帮助我了解了一些正在发生的事情。我没有提到这是打算在嵌入式系统上运行(对不起),所以我想尽可能避免使用includes或malloc。答案 0 :(得分:3)
这里有几种类型的混淆。指针指向内存(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手动将内存归零。
答案 1 :(得分:2)
问题不在于箭头->
运算符,它与赋值的右侧:初始值设定项中允许{0}
,但您无法分配这样的数组。您需要使用memset
将数组元素清零:
memset(newBuff->buff, 0, sizeof(newBuff->buff));
注意:您的代码未将newBuf
设置为内存中的有效位置。您需要先分配内存,如下所示:
newBuff->buff = malloc(sizeof(*newBuff));
答案 2 :(得分:0)
我不同意@dasblinkenlight,但我认为问题是newBuff是一个指针,但它没有给出一个值。因此,当您取消引用它时,您可能会遇到崩溃或不可预测的结果。
你必须有一个类似的声明:
newBuff = malloc(sizeof (Buffer));
分配适当大小的空间并将其分配给newBuff。
除非我遗漏了一些非常明显的东西......
答案 3 :(得分:0)
根据您的问题,我能够理解 - 您希望将结构变量buff[ ]
的所有数组元素初始化为零。
memset()
文件的 <string.h>
函数将帮助您解决此问题。
正如您所说,您正在为嵌入式系统编写代码,因此无需在程序中包含整个<string.h>
文件
我尝试复制您的程序并找到以下解决方案 -
void *memset(void * , int , size_t ) __attribute__((__nonnull__(1)));
#define BUFF_SIZE 100
typedef struct _buffer Buffer;
struct _buffer {
int buff[BUFF_SIZE];
int index;
};
int main (void)
{
Buffer* newBuff;
memset(newBuff->buff, 0, BUFF_SIZE);
}
如果它有用,请告诉我。