簡體   English   中英

使用memset初始化結構數組

[英]initializing a structure array using memset

gcc 4.4.4 c89

我有以下結構。

struct device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
};

int main(void)
{
    struct device_sys dev_sys[NUM_DEVICES];

    memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));

    return 0; 
}

當我調用memset時,我得到一個堆棧轉儲。 這不是初始化結構數組的正確方法嗎?

memset(&dev_sys, 0, sizeof dev_sys);

要么

memset(dev_sys, 0, NUM_DEVICES * sizeof(struct device_sys));

或者,如果您願意

memset(dev_sys, 0, NUM_DEVICES * sizeof *dev_sys);

但不是原始版本中的內容。

請注意,在所有變體的特定情況下,您可以使用&dev_sysdev_sys作為第一個參數。 效果是一樣的。 但是, &dev_sys在第一個變體中更合適,因為如果遵循memset(ptr-to-object, object-size)習語。 在第二和第三個變體中,使用dev_sys (或&dev_sys[0] )更合適,因為它遵循memset(ptr-to-first-element, number-of-elements * element-size)習語。

PS當然,在您的特定情況下,您應該使用初始化程序聲明您的數組,而不是使用所有那些hackish memset技巧

struct device_sys dev_sys[NUM_DEVICES] = { 0 };

不需要memset

您的代碼中存在拼寫錯誤。 固定:

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

挑選好名字可以避免一半的錯誤。 我推薦“設備”。

您必須傳遞sizeof運算符的類型而不是變量。

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

我更喜歡使用typedef作為結構。

typedef struct tag_device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
} device_sys;

你可以使用memset如下:

    memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));

對於數組, sizeof可以獲得數組的整個大小,而不是單個元素的大小。 sizeof運算符是少數幾個不將數組視為指向其第一個元素的指針的地方之一。

暫無
暫無

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

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