[英]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.