簡體   English   中英

為什么C不能直接分配數組但是可以在結構中分配數組?

[英]Why can't C assign an array directly but can assign an array in a struct?

該代碼不起作用:

int main() {
    int arr1[10];
    int arr2[10];

    arr2 = arr1;
    return 0;
}

但這有效:

struct foo {
    int arr[10];
};

int main() {
    struct foo f1;
    struct foo f2;

    f2 = f1;
    return 0;
}

但是在我看來,它們做同樣的事情:只需將一個數組復制到另一個數組。

C的歷史發展的結果是您不能直接引用數組。

arr2 = arr1; arr2arr1命名一個數組。 但是在C語言中有一條規則說,當在表達式中使用數組時,它會自動轉換為指向帶有某些實例的第一個元素的指針。 1 C肯定能夠將一個數組復制到另一個數組,例如memcpy(arr2, arr1, sizeof arr2); 問題在於,根本沒有辦法在賦值語句中引用數組。

進行數組的這種自動轉換是為了方便訪問數組元素和以最初開發C語言時使用的方式使用數組。 沒想到有必要將整個數組作為一個整體對象進行引用,並且為此語言沒有內置任何內容。 (即使到今天,也沒有必要,除了復制它之外,我們幾乎沒有要對數組作為單個對象執行的操作。)

早期的C實現也不允許您按賦值復制結構。 C是一種相當基本的語言,僅提供簡單的操作,而復制整個結構將是一件很花哨的事情。 后來,添加了復制結構的功能。

f2 = f1; f2f1引用結構,並且沒有規則將它們自動轉換為任何東西,就像數組一樣。

因此,問題僅是能夠表達所需操作的問題。

腳注

1規則是在C 2018 6.3.2.1 3中,並且例外是數組是sizeof或一元&的操作數,或者是用於初始化數組的字符串文字(如char x[] = "abc";"abc"是字符串文字,它是一個數組)。

這里

int main() {
    int arr1[10];
    int arr2[10];

    arr2 = arr1;
    return 0;
}

arr2 = arr1; 因為arr2是數組並且數組名本身是基地址(即const)而無法工作,所以您無法更改該地址,即arr2不能指向任何其他地址 通過做arr2 = arr1; 您正在嘗試更改不可能的arr2基址。 在這里

f2 = f1; /* structure member copy, f2 is structure variable and it can assigned with another structure variable f1 */

f2是一個結構變量,通過做f2 = f1; f1成員被復制到f2

但是在我看來,它們做同樣的事情:只需將一個數組復制到另一個數組。

是的,但是編譯器不允許執行第一個arr2 = arr1因為您不能更改arr2的基址,而在另一個f2=f1 f1結構變量成員會逐成員復制到f2成員,因為f2不是數組,可能是

6.3.2.1左值,數組和函數指示符的段落

  1. 當說一個對象具有特定類型時,該類型由用於指定該對象的左值指定。 *可修改的左值不具有數組類型不具有不完整類型 ,不具有const限定類型左值 ,並且如果是結構或聯合,則不具有任何成員(包括遞歸地const限定類型的所有包含的聚集或聯合的成員或元素)。

這里

arr2 = arr1;

左值操作數arr2 不可修改

另一個關於衰變的段落

  1. 除非它是sizeof運算符, _Alignof運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字 ,否則將類型為“ array of type ”的表達式轉換為帶有類型“ 指向類型的指針 ”,它指向數組objec t 的初始元素,並且不是左值

暫無
暫無

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

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