относительно размера упакованной структуры [дубликат]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

2
задан Nivak 9 January 2015 в 09:40
поделиться

2 ответа

У вас есть атрибут не в том месте - попробуйте следующее:

struct st { char c;
            int x __attribute__ ((packed));
          };

В соответствии с примером в руководстве gcc это приведет к тому, что x будет упакован таким образом, чтобы он сразу после c.

Конечно, вы не должны делать это в первую очередь, так как ваш код будет разбит на определенные архитектуры, и даже там, где он не сломается, могут быть штрафы за производительность.

2
ответ дан Paul R 19 August 2018 в 12:13
поделиться
  • 1
    Код OP работает для меня, поэтому помещать __attribute__ ((packed)) в конец должно быть хорошо – Gopi 8 January 2015 в 12:59
  • 2
    @Gopi, я не уверен в этом: упакованный атрибут указывает, что поле переменной или структуры должно иметь наименьшее возможное выравнивание - один байт для переменной и один бит для поля, если только вы укажите большее значение с выровненным атрибутом. – Keine Lust 8 January 2015 в 13:01
  • 3
    @AlterMann и @PaulR Согласно всем найденным в сети, он должен работать после структуры (или даже раньше, как в struct __attribute__ ((packed)) st { char c; int x; };). Но см. Комментарий Jayesh выше, я думаю, что это ошибка. – Nivak 8 January 2015 в 13:12
  • 4
    @PaulR Я бы использовал это только для сортировки, но, найдя ответ, я обнаружил, что на самом деле даже для этого я не должен ... Я в порядке с этим, но я хотел понять, как работает этот атрибут, дело. – Nivak 8 January 2015 в 13:16
  • 5
    Упакованный атрибут может быть помещен в переменные или структурные поля, описанные здесь: gcc.gnu.org/onlinedocs/gcc/… или его можно разместить на структурах, описанных здесь: gcc. gnu.org/onlinedocs/gcc/Type-Attributes.html. – nos 9 January 2015 в 09:49

Прекрасно работает в моей среде. Centos 5.11 (64bit) печатает 5 для первого упомянутого вами случая.

gcc версия 4.9.1 (GCC)

gcc-файл. c

./a.out 

5

0
ответ дан theadnangondal 19 August 2018 в 12:13
поделиться
  • 1
    Согласно ссылке Jayesh выше , это проблема с mingw. Я воспроизвожу ту же проблему с gcc-4.8.4 или gcc-4.9.2 как в 32 , так и в 64 бит , используя mingw-w64. В любом случае, спасибо за ваш ответ. – Nivak 9 January 2015 в 21:38
Другие вопросы по тегам:

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