簡體   English   中英

創建一個數組,數組的長度由用戶輸入確定:C vs C99 vs Java

[英]create an array whose length is determined by user input: C vs C99 vs Java

我正在嘗試找出創建數組的方法,該數組的長度在C和Java中是在運行時確定的(例如,通過用戶輸入)。

在C中,我知道某些C標准版本(例如C99)現在允許以下方式:

int size;
scanf("%d",&size);
int arr[size];

但是,從理論上講,像這樣在C中創建動態數組是不可接受的。 全局解決方案是在C中使用malloc()。

我的問題是,在Java中呢? 我已經在自己的計算機上運行了以下Java程序,未生成任何錯誤。 但是我不確定它是否僅適用於特定的Java平台(例如C情況下的C99)還是在所有Java平台中都普遍接受?

import java.util.Scanner;

public class Main{
    public static void main(String[] args){

    int size;

    System.out.println("enter a number:");
    Scanner s = new Scanner(System.in);
    size = s.nextInt();

    int[] arr = new int[size];
    }
}

這是完全可以接受的,並且通常在Java中完成。 new int[number]在運行時執行,並由動態數字執行。

只要數組的長度是一個非負的int ,這在Java中是有效的。

在Java中,您可以設置數組的長度,因為數組的創建是在運行時執行的,並且在所有Java平台中都應接受。

在Java中,數組是在堆上分配的。 如果分配失敗,將引發可捕獲的異常! 可以從失敗的陣列分配中恢復。

% java Main
enter a number:
1231231231
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at Main.main(Main.java:12)

捕獲異常:

try {
    int[] arr = new int[size];
} catch (OutOfMemoryError e) {
    System.out.println("Alas, such array could not be allocated. Try a smaller number next time!");
}

你得到

% java Main      
enter a number:
1231231231
Alas, such array could not be allocated. Try a smaller number next time!

在C99中經常不贊成使用可變長度數組的原因是,該數組是在stack上分配的。 現在,如果數組的大小來自用戶,則很容易導致無法控制的崩潰:

#include <stdio.h>

int main(void) {
    int size;
    scanf("%d", &size);
    volatile int arr[size];
    printf("%d\n", arr[size - 1]);
}

現在編譯並運行:

% ./a.out    
1231231231  
zsh: segmentation fault (core dumped)  ./a.out

無法檢查分配是否成功。 因此,如果您不確定-尤其是在處理可能來自不受信任用戶的數字時,則不應使用堆棧分配的可變長度數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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