簡體   English   中英

我可以在成員為指針的結構中使用標量初始化嗎?

[英]Can I use scalar initialization in a struct whose member is a pointer to pointer?

我有一個只有一個成員的結構。 該成員實際上是指向整數的指針,以表示二維整數數組。

創建該結構的實例時可以使用標量初始化嗎?

我正在嘗試創建一個二維數組來表示算法練習的像素集合。

我應該代表這樣的事情:

{
  { 0, 0, 1, 0, 0 },
  { 0, 1, 1, 1, 0 },
  { 1, 1, 1, 1, 1 }
}

為了表示圖像的一般抽象,我嘗試創建具有以下結構的結構:

struct image_t
{
  unsigned short int** pixels;
};

因此,我嘗試使用以下方法初始化該實例:

int
main()
{
  struct image_t image = {
    {
      {0, 0, 1, 0, 0},
      {0, 1, 1, 1, 0},
      {1, 1, 1, 1, 1},
    }
  };

  return 0;
}

當我嘗試編譯時,給出以下警告:

gcc -I src src/main.c -o bin/flood-fill.bin
src/main.c: In function ‘main’:
src/main.c:41:5: warning: braces around scalar initializer
     {
     ^
src/main.c:41:5: note: (near initialization for ‘image.pixels’)
src/main.c:42:7: warning: braces around scalar initializer
       {0, 1, 0},
       ^
src/main.c:42:7: note: (near initialization for ‘image.pixels’)
src/main.c:42:11: warning: excess elements in scalar initializer
       {0, 1, 0},
           ^
src/main.c:42:11: note: (near initialization for ‘image.pixels’)
src/main.c:42:14: warning: excess elements in scalar initializer
       {0, 1, 0},

經過研究后,我意識到,因為它將成為圖像表示,所以每一行的列總數相同。 因此,我可以只使用一個數組並將所有內容存儲在單個內存塊中。 它解決了我的問題

但是,作為一個好奇的家伙, 我想知道在這種情況下是否有任何方法可以使用標量初始化-如果可以,我該怎么做?

很可能我從C語言中缺少一些關鍵的基本概念,因此非常歡迎進行解釋。 我真的很想更好地了解它在引擎蓋下的工作方式。

這可能不是一個好主意,但是您可以使用復合文字來創建所需的結構,如下所示:

struct image_t
{
    unsigned short int **pixels;
};

int main(void)
{
    struct image_t image =
    {
        (unsigned short *[]) {
            (unsigned short []){ 0, 0, 1, 0, 0 },
            (unsigned short []){ 0, 1, 1, 1, 0 },
            (unsigned short []){ 1, 1, 1, 1, 1 },
        }
    };

    return image.pixels[1][4];
}

請注意,所示數據結構的問題之一是,沒有關於指針數組中有多少行,每行中有多少項的信息(並且不能保證每行的長度與其他行)。 僅此一個理由就足以認為該結構已損壞(無論如何,設計都很糟糕)。 如果添加了有關行和列的信息,則可能沒問題。

請注意, unsigned short **pixels; 不是指向2D數組的指針。 它是指向(一個或多個)指針的指針,這是完全不同的。

暫無
暫無

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

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