2013-11-22 73 views
2

我試圖用指定的初始化程序初始化const struct。但是,其中一個struct元素是一個固定寬度的數組。我已經有了我想用適當大小的另一個固定寬度數組初始化數組的內容。在指定的初始化程序中複製數組

有沒有辦法用指定的初始化工具來做到這一點?下面演示了一個我試圖完成的簡單(失敗的例子)。

struct foo { 
    uint8_t array1[4]; 
    uint8_t array2[4]; 
} 

uint8_t array[4] = { 
    1, 2, 3, 4 
}; 

struct foo const bar = { 
    .array1 = array,  // incompatible pointer to integer conversion 
    .array2 = { *array } // only copies the first element 
}; 
+0

我假設'struct foo'是用'array1'和'array2'定義爲'int [4]'?如果數組被定義爲指針,它會工作:'int * array1'。但顯然你會以這種方式失去信息。 – Kninnug

+0

@Kninnug,數據將被共享,而不是複製,但也許沒關係。 –

+0

你可以一個接一個地做,但有點難看,不夠健壯。 –

回答

1

簡答:你不能。 C不會複製數組(不使用(標準庫)函數)。警告來自這樣一個事實,即即使它們是靜態的或不變的,也不能將整個數組作爲一個整體。當一個數組被用作賦值中的r值時,它會衰減到一個指針,因此不能被分配給另一個數組(作爲一個整體)。

最簡單的方法是使用memcpy,但顯然必須在函數內。

+0

謝謝。我希望有一些魔法可以做到,但如果沒有,就是'memcpy'。 –

+0

不幸的是。我一直在瀏覽C99標準以找到一些確鑿的證據,但據我所知,沒有辦法使用純C(語法)複製數組。 – Kninnug

+0

@Kninnug如果數組嵌入到兼容的結構中,就可以完成。但是,結構不能通過在函數外複製來初始化,所以在這種情況下沒有幫助。 – tab

0

雖然你可能無法從另一個陣列複製到初始化數組,它可能會有所幫助使用預處理宏:

 
#define ARRAY_INIT {1, 2, 3, 4} 

struct foo const bar = { 
    .array1 = ARRAY_INIT, 
    .array2 = ARRAY_INIT 
}; 
+0

要從中複製字節的數組包含動態數據。 –

+0

那麼,你不能用動態數據初始化。編譯時必須知道它。 – wildplasser

+0

@wildplasser - 我認爲這是唯一的,如果有問題的對象是靜態的/具有全局範圍 - 至少這是什麼似乎爲我工作。 –

1

如果酒吧有全球範圍內,或聲明爲static,那麼你將不能使用指定的初始化器從非即時值進行初始化,而不管所討論的成員是否爲數組。

但是,如果:

  1. 條聲明某些函數的棧,並
  2. 你的固定大小的數組確實只有4個元素,

,那麼你可能是能夠擺脫這樣的事情:

#include <stdio.h> 
#include <stdint.h> 

struct foo { 
    uint8_t array1[4]; 
    uint8_t array2[4]; 
}; 

#define ARRAY_INIT(a) { a[0], a[1], a[2], a[3] } 

int main (int argc, char **argv) { 
    uint8_t arr_init[4] = { 
     1, 2, 3, 4 
    }; 
    struct foo const bar = { 
     .array1 = ARRAY_INIT(arr_init), 
     .array2 = ARRAY_INIT(arr_init), 
    }; 
    printf("%d, %d\n", bar.array1[0], bar.array2[3]); 
    return (0); 
} 

初始化程序數組必須出現befor e堆棧幀中正在初始化的內容。或者它可能來自一個函數參數。

當然,如果你的數組比這個大得多,那麼使用這樣的宏將會變得非常混亂。

+0

您將無法使用非常量元素進行初始化,但指定的初始化程序語法本身不受目標範圍或存儲的限制。 'static struct foo f = {.array1 = {[0] = 1,[1] = 2,[3] = 3,[4] = 4}}'是完全有效的。 – tab

+0

@tab - 是的 - 你是對的 - 我澄清了我的答案。 –