Есть ли улов? Да, есть - левые соединения - это форма внешнего объединения, а внутренние соединения - это форма, ну, внутреннее соединение.
Вот примеры, которые показывают разницу. Мы начнем с базовых данных:
mysql> select * from j1;
+----+------------+
| id | thing |
+----+------------+
| 1 | hi |
| 2 | hello |
| 3 | guten tag |
| 4 | ciao |
| 5 | buongiorno |
+----+------------+
mysql> select * from j2;
+----+-----------+
| id | thing |
+----+-----------+
| 1 | bye |
| 3 | tschau |
| 4 | au revoir |
| 6 | so long |
| 7 | tschuessi |
+----+-----------+
И здесь мы увидим разницу между внутренним соединением и левым соединением:
mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing | id | thing |
+----+-----------+----+-----------+
| 1 | hi | 1 | bye |
| 3 | guten tag | 3 | tschau |
| 4 | ciao | 4 | au revoir |
+----+-----------+----+-----------+
Хмм, 3 строки .
mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing | id | thing |
+----+------------+------+-----------+
| 1 | hi | 1 | bye |
| 2 | hello | NULL | NULL |
| 3 | guten tag | 3 | tschau |
| 4 | ciao | 4 | au revoir |
| 5 | buongiorno | NULL | NULL |
+----+------------+------+-----------+
Ничего себе, 5 строк! Что произошло?
Внешние соединения, такие как left join
, сохраняют строки, которые не совпадают, поэтому строки с идентификаторами 2 и 5 сохраняются левым запросом соединения. Остальные столбцы заполняются с помощью NULL.
Другими словами, левое и внутреннее соединения не являются взаимозаменяемыми.
Для проверки памяти вне зависимости от типа данных программы gdb предоставляет команду x с синтаксисом follow,
x/nfu addr
Здесь /nfu
является необязательным, где
n - сколько память для отображения в счетчике согласно опции u. Отрицательный знак спереди вызовет чтение с уменьшенным адресом
f - формат отображения
u - размер блока. Например, 'h' соответствуют полусловам
. Для данной структуры, чтение для двух целочисленных размеров в соответствии с вашей машиной даст содержание структуры. Первое целое число для значения n
и второе для адреса указателя. Так что здесь для двух слов читать,
x/2uw 0x61b2e0
Вы можете использовать команду x
для печати с заданного адреса.
x (s_a*) 0x61b2e0
(gdb) p *((s_a *)(<address>))
должен помочь вам распечатать содержимое структуры, на которую ссылается <address>
виртуальный адрес, т. Е. В вашем случае это будет: (gdb) p *((s_a *)(0x61b2e0))