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