2013-10-29 76 views
2

嘗試在C中初始化數組時出現奇怪的錯誤 - 任何人都知道爲什麼會發生這種情況?使用Typedefs在C中進行數組初始化

我有一個全局變量:

static my_type foo[6]; 

而在包含的頭文件,我有:

typedef uint32_t my_type[5]; 

我則在同一個文件中的全局變量的函數嘗試做:

foo = {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 6}, {1, 2, 3, 4, 7}, {1, 2, 3, 4, 8}, {1, 2, 3, 4, 9}, {1, 2, 3, 4, 10}}; 

編譯器(GCC4)在'{'token'之前給出錯誤'expected expression'。

任何人都知道出了什麼問題,以及如何解決它?

乾杯!

回答

4

這不是初始化,這是分配。初始化必須是單個語句:

static my_type foo[6] = {{1, 2, 3, 4, 5}, 
         {1, 2, 3, 4, 6}, 
         {1, 2, 3, 4, 7}, 
         {1, 2, 3, 4, 8}, 
         {1, 2, 3, 4, 9}, 
         {1, 2, 3, 4, 10}}; 

您不能使用此語法分配給C89中的整個數組。你可以做的是從constmemcpy

void initialize_foo() 
{ 
    static const my_type init[6] = 
         {{1, 2, 3, 4, 5}, 
         {1, 2, 3, 4, 6}, 
         {1, 2, 3, 4, 7}, 
         {1, 2, 3, 4, 8}, 
         {1, 2, 3, 4, 9}, 
         {1, 2, 3, 4, 10}}; 
    assert(sizeof(foo) == sizeof(init)); 
    memcpy(foo, init, sizeof(foo)); 
} 
+0

他並說: 「在一個函數」 雖然。他試圖在聲明之外初始化一個變量的問題是什麼? – mjs

+0

@mjs:發現,糾正了答案。 –

+0

是的,基本上我有一個函數在文件中更低(我的全局變量在頂部),我試圖將數組設置爲我在函數中寫的內容。這當然有可能嗎?或者,如果沒有,是否有另一種做我想做的事情的方式? –

4

如果你是C99下:

ISO C99支持複合文字。複合文字看起來像包含初始值設定項的變體 。其值是演員指定的 類型的對象,其中包含 初始值設定項中指定的元素;這是一個左翼。作爲擴展,GCC支持C89模式和C++中的複合文字。

foo必須是指向

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

typedef uint32_t my_type[5]; 

int main(void) 
{ 
    int i, j; 
    my_type *foo; 

    foo = ((my_type[]) { 
     {1, 2, 3, 4, 5}, 
     {1, 2, 3, 4, 6}, 
     {1, 2, 3, 4, 7}, 
     {1, 2, 3, 4, 8}, 
     {1, 2, 3, 4, 9}, 
     {1, 2, 3, 4, 10} 
    }); 
    for (i = 0; i < 6; i++) { 
     for (j = 0; j < 5; j++) { 
      printf("%d ", foo[i][j]); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 
+1

你確定'foo = ABC'是否被允許? 'foo'是一個左值,但數組左值不可修改。 – dyp

+0

根據6.2.5/6「如果複合文字出現在函數體外,則該對象具有靜態存儲持續時間;否則,它具有與封閉塊相關的自動存儲持續時間。」我不會讓'foo'靜態,分配的文字只有自動存儲持續時間;另外,'main'中'static'變量的好處是什麼? – dyp

+0

你是對的(再次),在這種情況下沒有任何好處,但OP在他的例子中使用'static'。無論如何編輯。 –