2012-03-05 67 views
15

我在C中知道我可以做以下事情。在聲明之外初始化C數組?

int test[5] = {1, 2, 3, 4, 5}; 

現在這只是聲明數組時才合法。不過,我想知道爲什麼這是後來不合法?但是後來在這個程序中,執行以下操作是不合法的。

test[5] = {10, 20, 30, 40, 50}; 

或類似的東西。爲什麼是這樣?我知道這不合法,我不是在抱怨,但是有人能給我一個更爲技術性的解釋,爲什麼我不能這樣做? (即不要只說C規範不允許它或類似的東西)

我假設它必須做的事情,當內存獲取分配在堆棧上的數組,因此在那一點上C可以自動填寫我的值,但爲什麼不能在以後做?

謝謝你們

+2

所以,如果,假設,有人的情況下,在C標準只是不會允許這種(儘管這在技術上是可能的),我們不得不做出一些不同的東西而不是?或者你是不想得到答案?只是想確定。 – 2012-03-05 15:05:33

+1

@NiklasB .:我認爲在這種情況下,一個有爭議的受過教育的猜測是爲了*爲什麼C語言的設計者決定忽略這個特性將會是一個很好的答案。 – Heinzi 2012-03-05 15:07:54

+0

@Heinzi:哦,我明白了:) – 2012-03-05 15:08:29

回答

6

的一點是,使用int array[]={ }聲明初始化您已創建的對象。

實際上,你可以分配值數組後,它一直宣佈

int array[5]; 
array[0] = 1, array[1] = 2, ... 

什麼,你這樣做是分配幾個一個單一陣列條目:

array[5] = {1,2,3,4,5}; // array[5] can only contain one value 

This wo而不是合法的:

array[5] = 6; 

希望這是有道理的。只是一個語法問題。

+0

哦。 Duhhh。這真的幫了我。 – kando 2016-11-19 20:03:10

17

這不僅僅是數組,你不能在定義中的任何點上爲什麼提供初始值設定項。人們有時會將int i; i = 0;之類的第二個陳述稱爲「初始化i」。實際上它分配給i,由於它沒有被初始化,它以前保持不確定的值。將這種「初始化」稱爲非常困難,但就語言而言,這裏沒有初始化。

作業和初始化與語言是分開的,即使它們都使用=字符。數組不可分配。

數組不可分配的原因在其他地方介紹過,例如Why does C++ support memberwise assignment of arrays within structs, but not generally?。簡而言之,就是「歷史原因」。我不認爲有任何殺手技術的原因,爲什麼不能改變語言來允許數組分配。

還有一個次要問題,那就是在語法上{1, 2, 3, 4, 5}是一個初始值設定項,而不是數組文本,因此即使數組是可賦值的也不能用於賦值。我不確定C89爲什麼沒有數組文字,可能只是沒有人需要它們。 C99通常引入「複合文字」的語法,尤其是數組文字:(int[]) {1, 2, 3, 4, 5}。你仍然不能從它分配數組。

3

注意,C99化合物字面允許你「傳遞數組給函數」:

int your_func(int *test) 
{ 
    ...use test as an array... 
} 

void other_func(void) 
{ 
    int x = rand(); 
    if (your_func((int[]){ 0, 1, 2, x, 3, 4 }) > 0 || 
     your_func((int[]){ 9, x, 8, 7, 6, 5 }) > 0) 
     ...whatever... 
} 

這並不像重新初始化具有不同值的陣列是相同的,但它可能是足夠接近該它適合你。

0

在表面的原因是數組幾乎無處不在轉換爲指向第一個元素的指針。如果有兩個陣列

double A[5]; 
double B[5]; 

在表達如

A = B; 

兩者都已經轉化爲指針。左邊的A尤其不是「左值」,因此您無法分配給它。

這聽起來像一個蹩腳的藉口,但我的猜測是,歷史上它就是這樣發生的。 C(和C++)被困在一個早期的語法選擇中,如果你想保持與遺留代碼的兼容性,那麼可能沒有太多辦法。

+0

您是否有任何引用說這是設計決策背後的原因? – 2012-03-05 18:53:15

+0

@DavidHeffernan,不幸的不是,否則我會給它。在C11中,6.7.1 p6(加上腳註)仍然表明,這個轉換爲指針的義務被視爲數組的基本特徵。我認爲這是不幸的,特別是分配和指定者將是很好的功能。但期待這種修改的發生是不現實的。 – 2012-03-06 07:23:58

+0

但沒有引用,這是猜測。而且我實際上無法看到爲什麼分配數組無法實現的技術原因。 – 2012-03-06 07:35:29

2

這裏的解決方案

//Declaration 
int a[5]; 
int a_temp[5] = {1, 2, 3, 4, 5 }; 
memcpy(a, a_temp, sizeof(a)); 
//Now array a have values 1, 2, 3, 4, 5