Как я могу получить доступ к членам этой структуры в C? - PullRequest
1 голос
/ 15 октября 2010

Я работаю с этой структурой в C:

/** This structure describes an Internet host address. */
typedef struct pj_hostent
{
    char    *h_name;        /**< The official name of the host. */
    char   **h_aliases;     /**< Aliases list. */
    int      h_addrtype;    /**< Host address type. */
    int      h_length;      /**< Length of address. */
    char   **h_addr_list;   /**< List of addresses. */
} pj_hostent;

Я могу получить доступ к h_name части структуры в порядке, как это:

strcpy(test1, he->h_name); // copy part of struct into char[] array

и содержит содержательное значение "sip2". Однако, когда я пытаюсь получить доступ к элементам h_addr_list следующим образом:

strcpy(test1, he->h_addr_list[0]);

Я получаю бессмысленный бред.

Какой правильный путь в C для доступа к таким значениям?

Ответы [ 8 ]

4 голосов
/ 15 октября 2010

h_addr_list[0] - это не строка, это pj_in_addr, представляющее собой 32-разрядное целое число, которое не заканчивается нулем.

printf() это с %d или %x, а не %s.

См. Ссылка PJLIB: Разрешение сетевого адреса для примера использования.

1 голос
/ 15 октября 2010

То, что он объявлен как char**, означает НЕ , что это массив строк.

Это может быть указатель на байтовый буфер неизвестного формата.(т. е. jibberish)

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

1 голос
/ 15 октября 2010

Вы получаете доступ к нему правильно.Это поле действительно содержит бред.

0 голосов
/ 15 октября 2010

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

0 голосов
/ 15 октября 2010

Короткий пример, который работает. Помните, что выделение для структуры не выделяет для указателя.

typedef struct pj_hostent
{
    char    *h_name;        /**< The official name of the host. */
    char   **h_aliases;     /**< Aliases list. */
    int      h_addrtype;    /**< Host address type. */
    int      h_length;      /**< Length of address. */
    char   **h_addr_list;   /**< List of addresses. */
} pj_hostent;

int _tmain(int argc, _TCHAR* argv[])
{
    char* s[]= {"this","is","couple of words"};
    pj_hostent hst = {"high",s,3,4,s };
    char  buff[255] = {};
    //Access as a local initialized struct
    strcpy(buff,hst.h_addr_list[0]);
    printf("%s\n",buff);
    pj_hostent * he = & hst; 
    //Access as a pointer 
    strcpy(buff,he->h_addr_list[0]);
    printf("%s\n",buff);
    gets(buff);
}
0 голосов
/ 15 октября 2010

Структура содержит только указатель.Вам нужно выделить некоторое хранилище для этого указателя, чтобы указать на , прежде чем вы сможете его использовать.Как таковой, указатель почти наверняка просто содержит (более или менее) случайное значение.Когда вы используете это в качестве цели при вызове strcpy, вы перезаписываете эту случайную ячейку памяти - что может и приведет к серьезным проблемам в других местах.

h_addr_list почти так же- это просто указатель на указатель.Это (обычно) будет использоваться для ссылки на массив строк, но что-то должно выделить этот массив строк, прежде чем его можно будет использовать для какого-либо значимого использования.Учитывая сходство со структурой hostent, наряду с этой структурой, вероятно, существует некоторый аналог (или оболочка) gethostbyname и / или gethostbyaddress, который инициализирует это.В случае оболочки (которую я бы оценил как наиболее вероятную из двух), он, вероятно, получает правильные данные в hostent, а затем копирует данные из hostent в эту структуру.

0 голосов
/ 15 октября 2010

strcpy предполагает, что вы уже выделили память для указателя символов. Так что, возможно, указатель все еще имеет значение NULL.

0 голосов
/ 15 октября 2010

элементы структуры доступны с помощью оператора точки

strcpy(test1, he.h_addr_list[0]);

элементы структур, на которые "указывают", доступны с помощью оператора ->

strcpy(test1, he->h_addr_list->[0]);

Если вы получаетето есть либо тарабарщина, либо test1 недостаточно велик, либо h_addr_list не указывает на массив char *, либо первый элемент массива на самом деле - тарабарщина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...