簡體   English   中英

指向包含數組的結構的指針

[英]Pointer to struct containing array

我有一個簡單的結構,其中包含一個整數數組和一個用於該數組的索引。

#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指針將使我可以訪問數組。 我對此是否有錯,還是我在這里錯過了一些東西? 我感覺這很簡單,但是對於我的一生,我只是無法發現。

謝謝!

編輯:感謝你們的快速解答,他們幫助我了解了一些正在發生的事情。 我忽略了提及它打算在嵌入式系統上運行(對此感到抱歉),因此我盡可能避免使用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手動將內存清零。

問題不在於箭頭->運算符,而在於賦值的右側:初始化程序中允許使用{0} ,但是您不能像這樣分配數組。 您需要使用memset將數組元素歸零:

memset(newBuff->buff, 0, sizeof(newBuff->buff));

注意:您的代碼未將newBuf設置為newBuf中的有效位置。 您需要首先分配內存,如下所示:

newBuff->buff = malloc(sizeof(*newBuff));

我必須不同意@dasblinkenlight,但我認為問題是newBuff是一個指針,但尚未提供值。 因此,當您取消引用它時,您可能會崩潰或無法預測的結果。

您必須擁有類似以下內容的聲明:

newBuff = malloc(sizeof (Buffer));

分配適當大小的空間並將其分配給newBuff。

除非我錯過了非常明顯的東西...

通過您的問題,我能夠理解-您要將結構變量buff[ ]所有數組元素初始化為零。

<string.h>文件中的memset()函數將幫助您解決此問題。

如您所說,您正在為嵌入式系統編寫代碼,因此無需在程序中包含整個<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);
}

請讓我知道是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM