создать массив, длина которого определяется пользовательским вводом: C против C99 против Java - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь найти методы для создания массива, длина которого определяется во время выполнения (например, пользовательским вводом) в C и Java.

В C я знаю, что некоторые версии стандартов Cтакие как C99, теперь разрешают следующий путь:

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

Однако, теоретически, недопустимо создавать такой динамический массив в C, как этот.Глобальное решение состоит в том, чтобы использовать malloc () в C.

Мой вопрос, а как насчет Java?Я запустил следующую программу Java на своем компьютере, и не было сгенерировано ошибок.Но я не уверен, является ли он правильным только для конкретной платформы Java (например, C99 в случае C) или он универсально приемлем во всех 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];
    }
}

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

В Java вы можете установить длину массива, поскольку создание массива выполняется во время выполнения и должно быть принято на всех платформах Java.

0 голосов
/ 23 мая 2018

В 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

Есть невозможно проверить, было ли выделение выполнено успешно или нет.Поэтому, если вы не уверены - и особенно когда играете с числами, которые могут быть получены от ненадежного пользователя, вы не должны использовать выделенные стеком массивы переменной длины.

0 голосов
/ 23 мая 2018

Это вполне приемлемо и обычно делается на Java.new int[number] выполняется во время выполнения, и динамическое число делает это.

Пока длина массива неотрицательна int, это допустимо в Java.

...