Показанный номер версии описывает версию JRE, совместимую с файлом класса.
Сообщенные основные номера:
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
(Источник: Wikipedia )
Чтобы исправить настоящую проблему, вы должны попробовать либо запустить Java-код с более новой версией Java JRE, либо указать целевой параметр компилятору Java, чтобы дать команду компилятору создать совместимый код с более ранними версиями Java.
Например, для генерации файлов классов, совместимых с Java 1.4, используйте следующую командную строку:
javac -target 1.4 HelloWorld.java
С более новыми версиями компилятора Java вы, вероятно, получите предупреждение о том, что путь класса bootstrap не задан. Более подробную информацию об этой ошибке можно найти в сообщении в блоге Новое предупреждение javac для установки более старого источника без bootclasspath .
Поскольку вы используете sizeof(*ptr)
, вы действительно запрашиваете размер первого элемента в выделенном буфере, поэтому sizeof
вернет размер первого элемента в ptr
(т. е. целые числа 2x4 байтов на 32bits), а не назначенный размер.
Также обратите внимание, что даже если вы будете использовать sizeof(ptr)
, вы получите размер указателя ptr
, который на 32-битной системе будет 4 байта .
Почему же использование параметра sizeof (* ptr) дает только 8? Как найти общий размер, выделяемый для ptr?
blockquote>Тип выражения
*ptr
-integers
- таким образом,sizeof *ptr == sizeof (integers) == sizeof (int) + sizeof (int)
Вы не можете определите размер выделенного буфера, посмотрев на указатель (он не хранит никаких метаданных о размере буфера). Вам придется отслеживать эту информацию отдельно.
Изменить
Обратите внимание, что вы можете сделать что-то вроде следующего:
integers (*foo)[10] = malloc( sizeof *foo ); if ( foo ) printf( "sizeof *foo = %zu\n", sizeof *foo );
, и это даст вам результат, который вы ожидаете. В этом случае
foo
является указателем на массив изintegers
, а не на один экземплярintegers
, поэтомуsizeof *foo
предоставит вам размер выделенного массива. Недостатком является то, что перед тем, как применить индекс:(*foo)[i].a = some_value(); // or foo[0][i].a (*foo)[i].b = some_other_value(); // or foo[0][i].b
, вы должны явно разыменовать
foo
. Обычно это делается, когда вы хотите выделить массив NxM и убедитесь, что все строки смежны:integers (*foo)[10] = malloc( 10 * sizeof *foo );
будет выделять массив 10x10 из
integers
, чтобы строки были смежными в памяти.Кроме того, указатель на 10-элементный массив из
integers
не является совместимый с указателем на 11-элементный массивintegers
, что затрудняет запись функций, которые могут работать с указателями на массивы разных размеров. IOW, если у вас есть функция, объявленная какvoid bar( integers (*foo)[10] ) { ... }
, она может работать только с массивами Nx10
integers
. Есть способы вокруг этого, которые связаны с различными уровнями боли, но это тема для другого дня.
sizeof(*ptr)
- это размер одного объекта типаintegers
. Если я могу предположить, что вашint
является 32-битным целым числом, тогдаintegers
будет иметь размер8
. Часть 2: Значениеsizeof(ptr)
- это размер указателя. Обычно это будет 4 или 8 байтов в зависимости от вашей платформы. – Bill Lynch 22 April 2015 в 22:24