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