指向包含数组的struct的指针

时间:2014-03-15 02:00:44

标签: c arrays pointers dereference

我有一个简单的结构,包含一个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。

4 个答案:

答案 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);
}

如果它有用,请告诉我。