亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果我在C/C+中定義了一個0大小的數組,會發生什么?

如果我在C/C+中定義了一個0大小的數組,會發生什么?

C++
慕沐林林 2019-06-24 13:02:14
如果我在C/C+中定義了一個0大小的數組,會發生什么?只是好奇,如果我定義了一個零長度數組,會發生什么?int array[0];用密碼?GCC一點也不抱怨。樣本程序#include <stdio.h>int main() {     int arr[0];     return 0;}澄清我實際上是想弄清楚,以這種方式初始化的零長度數組,而不是像Darhazer的注釋中的可變長度那樣,是否被優化了。這是因為我必須發布一些代碼到野外,所以我試圖找出我是否必須處理SIZE定義為0,它發生在具有靜態定義的代碼中。int array[SIZE];我其實很驚訝GCC沒有抱怨,這就引出了我的問題。從我收到的答案來看,我認為沒有警告很大程度上是因為支持沒有用新的[]語法更新的舊代碼。因為我主要想知道這個錯誤,我把Lundin的答案標記為正確(Nawaz的答案是第一位的,但它沒有那么完整)-其他人都指出了它在尾部填充結構中的實際用途,雖然它是相關的,但并不是我想要的。
查看完整描述

3 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

數組的大小不能為零。

ISO 9899:2011 6.7.6.2:

如果表達式是常量表達式,則其值應大于零。

對于普通數組(第1段),上述案文都是正確的。對于VLA(可變長度數組),如果表達式的值小于或等于零(第5段),則不定義該行為。這是C標準中的規范文本。編譯器不允許以不同的方式實現它。

gcc -std=c99 -pedantic對非VLA案件提出警告。


查看完整回答
反對 回復 2019-06-24
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

通常情況下,這是不允許的。

然而,在C中使用柔性陣列.

C99 6.7.2.1,第16節作為特例,具有多個命名成員的結構的最后一個元素可能具有不完整的數組類型;這稱為靈活數組成員。

示范:

struct Array {
  size_t size;
  int content[];};

這樣你就可以分配它:

void foo(size_t x) {
  Array* array = malloc(sizeof(size_t) + x * sizeof(int));

  array->size = x;
  for (size_t i = 0; i != x; ++i) {
    array->content[i] = 0;
  }}

您也可以靜態地使用它(GCC擴展):

Array a = { 3, { 1, 2, 3 } };

這也被稱為尾墊結構(本術語早于C99標準的發布)或結構黑客(感謝JoeWreschnig指出這一點)。

然而,這種語法直到最近才在C99中被標準化(并保證了效果)。在需要一個恒定的尺寸之前。

  • 1

    是便攜的方式,雖然很奇怪
  • 0

    在表示意圖方面做得更好,但就標準而言并不合法,一些編譯器(包括GCC)將其作為擴展提供了支持。

然而,尾部填充物的實踐依賴于一個事實,即存儲是可用的(小心)。malloc)我也是不適合在一般情況下疊加使用。


查看完整回答
反對 回復 2019-06-24
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

在標準C和C+中,零大小數組是允許.。

如果使用GCC,請用-pedantic選擇。它會給警告,說:

zero.c:3:6: warning: ISO C forbids zero-size array 'a' [-pedantic]

在C+的情況下,也會給出類似的警告。


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 1024 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號