據我所知,C標準禁止使用陣列的作爲(修改)的左值,即,在賦值的左側:爲什麼數組不是左值?
int lhs[4], rhs[4] = {0, 1, 2, 3};
lhs = rhs; /* illegal! */
現在,我已經知道爲什麼是這種情況。我可以看到上面是聲明(和寫入到陣列的任何其他分配)定義相當於
memcpy((void *) lhs, (void *) rhs, sizeof(lhs));
氣派確保該rhs
足夠大,用戶的負擔,但它不是決定這應該是這樣的。
然而,一個非常類似的例子確實工作完美的罰款:
struct { int a[4]; } lhs, rhs = {{0, 1, 2, 3, 4}};
lhs = rhs;
只需通過包裹所述陣列中的結構,可以得到上述準確描述的行爲,即,分配lhs = rhs
等同到:
memcpy((void *) &lhs, (void *) &rhs, sizeof(lhs));
這是什麼原因(我覺得)不一致?允許將數組賦值解釋爲memcpy
s有什麼問題嗎?
這裏回答了這裏:http://stackoverflow.com/a/17691191/14955(向下滾動到Edit2:真實原因) – Thilo 2015-01-21 02:13:30
數組名稱*是一個左值。我想你問的是爲什麼數組不可分配。 – 2015-01-21 02:24:27
可能的重複:http://stackoverflow.com/q/27881442/827263 – 2015-01-21 02:25:09