簡體   English   中英

通過讀取用戶的值創建10個整數的輸入數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM