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;
}
很奇怪這段代碼為什麼能編譯通過。想了想還是把下面的代碼發出來吧。部分環境下也是不能編譯通過的。
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編程語言 |