Как вы это описали, в вашей функции LoadData()
, str
- это указатель на скаляр, который является другим указателем.str[i]
, следовательно, создает доступ к массиву вне границ, когда i
отличается от 0, поскольку для этой цели скаляр эквивалентен одноэлементному массиву.
С другой стороны, *str
, другой указатель, указывает на первый элемент массива.Предполагая, что этот массив содержит n
элементов, следовательно, выражение (*str)[i]
обращается к допустимому элементу массива (типа STRUCTURE
) для любого i
в диапазоне от 0 до n - 1
включительно.Поскольку это обозначает STRUCTURE
, а не STRUCTURE *
, вы должны получить доступ к его элементам через оператор .
, а не через ->
.
Чтобы более четко увидеть, что ваши два выражения различны,давайте преобразуем их согласно тождествам a[b] == *((a) + (b))
и p->x == (*p).x
.С одной стороны у нас есть
&str[i]->len == &(str[i]->len)
== &((*str[i]).len)
== &((**(str + i)).len)
, тогда как с другой стороны у нас есть
&(*str)[i].len == &(((*str)[i])).len)
== &((*(*str + i)).len)
.Обратите внимание, что **(str + i)
не эквивалентно *(*str + i)
.