標籤:

C語言 不定長數組不能在if結構里?

#include &
#include &

void arr(int size){
if(size&>0){
int a[size];
a[0]=99;
}
printf("a[0]=%d
",a[0]);
}
int main()
{
arr(2);
return 0;

}

運行結果:a[0]=0;

如果不定義在if結構里就是正確的,這是為什麼啊?

是我搞錯了,printf("a[0]=%d
",a[0]);必須在if結構里。我本意是想實現個,條件定義數組。我知道用malloc可以實現,但是我不想用,因為還要寫個free。


本質上是作用域的問題。這段代碼不應該被編譯通過,也是因為作用域外不能訪問a。

對於數組長度表達式的質疑,C99開始引入的標準,Variable-length array, 請參見:

ISO 9899:2011 Programming Languages - C

6.7.6.2

https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html


嗯,請複習一下"生存期與作用域"的概念.


這都能編譯通過,這個編譯器太牛了。

你編譯的時候,難道沒有提示這個么:error: use of undeclared identifier "a";


用python interpreter運行的吧(誤)


花括弧會形成一個局部作用域,在裡面定義的變數僅僅在花括弧內有用,if語句之後a就被銷毀了。


樓主你從了老納吧,告訴我這是什麼編譯器?


看標題還以為題主說的是:

struct MyArray

{

int len;

char data[0];

};  


作用域啊,出了if的花括弧,那數組編譯不報錯?!


初學c語言都想著弄個不定長的,後來我發現一個方法(C++和C語言);

#include &
#include &
void arr(int size){
int *a = nullptr;
if(size&>0){
a = new int[size];//c++方法
/*C語言方法

a = (int*) malloc(sizeof(size));
*/

a[0]=99;
}
printf("a[0]=%d
",a[0]);
delete []a;//c++方法
//free(a);//與malloc對應的,C語言
}
int main() {
arr(2);
return 0;
}

// @Jecvay 這樣寫對么?

//對於評論區的各位大神我來解答一下.

//1.new的確是c++的方法,我搞混亂了,這是我學藝不精,實在慚愧;

//2.至於new int(size)這個東西,我的xcode確實編譯通過沒報錯;我又專門查了一下( )是創建單個對象時用的,[ ]才是動態數組;

//3.new int[size]這種new數組方法在c++和java中都存在,雖然我雙修的比較混亂但是這點貌似還沒走火入魔; @錢中飛

//5.在xcode下,我的上述代碼沒有任何錯誤或警告提示.題主給的代碼不需要編譯,貼上就報錯;

//6.delete問題,我經常忘,非常感謝提醒; @Mio Yuan@朱慶喵


很奇怪這段代碼為什麼能編譯通過。

想了想還是把下面的代碼發出來吧。部分環境下也是不能編譯通過的。

void arr(int size)
{
if (size &<= 0) { printf("0 "); return; } int a[size]; a[0] = 99; printf("a[0] = %d ",a[0]); }


很好奇你用的是什麼編譯器,居然可以通過編譯。


推薦閱讀:

為什麼 C++ 能夠源碼級兼容C語言?
C中int main()和int main(int argc,char* argv[])的區別?
C primer plus該怎麼看?
新手使用c primer plus中文第五版學習c語言,windows下推薦用什麼編譯器?
如何看c primer plus這本書?

TAG:C編程語言 |