Функция C malloc () не работает, как я ожидал [дубликат]

Показанный номер версии описывает версию 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 .

1
задан Adarsh Rao 22 April 2015 в 22:14
поделиться

2 ответа

Поскольку вы используете sizeof(*ptr), вы действительно запрашиваете размер первого элемента в выделенном буфере, поэтому sizeof вернет размер первого элемента в ptr (т. е. целые числа 2x4 байтов на 32bits), а не назначенный размер.

Также обратите внимание, что даже если вы будете использовать sizeof(ptr), вы получите размер указателя ptr, который на 32-битной системе будет 4 байта .

2
ответ дан Amnon Shochot 22 August 2018 в 02:48
поделиться
  • 1
    На самом деле, если я использую sizeof (ptr), я получаю вывод 4. – Adarsh Rao 22 April 2015 в 22:21
  • 2
    @AdarshRao: Часть 1: Значение sizeof(*ptr) - это размер одного объекта типа integers. Если я могу предположить, что ваш int является 32-битным целым числом, тогда integers будет иметь размер 8. Часть 2: Значение sizeof(ptr) - это размер указателя. Обычно это будет 4 или 8 байтов в зависимости от вашей платформы. – Bill Lynch 22 April 2015 в 22:24
  • 3
    Это связано с тем, что вы компилируете свой код с 32-битной архитектурой, где указатель длиной 32 бит (4 байта). – Amnon Shochot 22 April 2015 в 22:24

Почему же использование параметра sizeof (* ptr) дает только 8? Как найти общий размер, выделяемый для ptr?

Тип выражения *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. Есть способы вокруг этого, которые связаны с различными уровнями боли, но это тема для другого дня.

1
ответ дан John Bode 22 August 2018 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: