[英]Create an input array of 10 ints by reading values from the user
我正在嘗試以下代碼:
int main() {
int x[10] ;
int a[] = {1,2,3,4,5} ;
int n ;
int b[n] ;
//int c[] ; gives compilation error
cout<<sizeof(x)<<endl ; //prints 40
cout<<sizeof(a)<<endl ; //prints 20
cout<<sizeof(b)<<endl ; //prints 4
}
現在我的問題是當我定義b
時到底發生了什么。 我試圖閱讀類似問題的答案,但我沒有得到滿意的答復。 因為數組是靜態創建的,所以在聲明它們時必須給出大小。 那么為什么b
聲明有效。 sizeof(b)
是否表明這只是作為int pointer
處理
究竟發生了什么
int n ; int b[n] ;
使用未初始化的整數值(窄字符類型除外)具有未定義的行為( UB )。 此外,由於n
不是編譯時常量,而是用作數組的大小,程序根據C ++標准是不正確的(這意味着允許編譯器拒絕編譯程序,並且是必需的至少顯示診斷信息)。
但是,如果您的編譯器支持可變長度數組( VLA ,語言擴展),那么究竟發生了什么取決於編譯器如何實現VLA(當然,它是如何處理您引入的UB的)。
那么為什么
b
聲明有效。
這是在事實上,在標准C ++ 無效 。
sizeof(b)
是否表明這只是作為int
指針處理
不會。由於行為未定義,輸出不顯示任何內容。 即使你的系統上int
指針的大小恰好是4,輸出也只是偶然相同。
在C ++中,不允許使用可變長度數組,數組必須是固定大小的,如果要動態分配大小,可能需要使用malloc
並手動分配內存。 但是, int
的默認值用於此目的。 我不會推薦這種做法,因為它可能會產生未定義的行為。 閱讀這些鏈接Array [n] vs Array [10] - 初始化具有變量與實數的數組, 為什么不是C ++標准的可變長度數組? 他們有一些很好的解釋。
首先, int b[n]
不是有效的C ++代碼,除非n
是常量表達式。 你只是因為使用GCC而逃脫它,並且允許它作為擴展( https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html#Variable-Length )。
其次,要檢查發生了什么,讓我們看看:
我的程序var-arr.cpp:
#include <iostream>
using namespace std;
int main() {
int m=0, n=5, k;
int a[m], b[n], c[k];
cout
<< "sizeof(a)=" << sizeof(a)
<< " sizeof(b)=" << sizeof(b)
<< " sizeof(c)=" << sizeof(c)
<< endl;
}
這是我編譯運行時發生的事情( [~/CPP]
是提示)
[~/CPP] g++ -o var-arr var-arr.cpp
[~/CPP] ./var-arr
sizeof(a)=0 sizeof(b)=20 sizeof(c)=0
一段時間之后
[~/CPP] ./var-arr
Segmentation fault (core dumped)
這是什么意思? 這意味着當你寫int n;
在函數內, n
仍然未初始化。 所以當你寫int a[n];
之后,長度a
可以任何東西。 它也可以是過大,分配a
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.