Захотелось написать просто динамический массив. Сначала реализовал связанный список. Все работает все хорошо, но не очень красиво и очень похоже на велосипед. Вследствие недолгих размышлений пришел к мысли (Да обязательное условие only C):
Здравствуйте, Zulin_78, Вы писали:
Z_>Захотелось написать просто динамический массив. Сначала реализовал связанный список. Все работает все хорошо, но не очень красиво и очень похоже на велосипед. Вследствие недолгих размышлений пришел к мысли (Да обязательное условие only C):
Z_>#include <stdio.h> Z_>#include <signal.h> Z_>#include <unistd.h> Z_>#include <netinet/in.h>
Z_>int main(int argc, char **argv) { Z_> struct in_addr **_addr; Z_> int i=0, n, c; Z_> while( (c = getopt(argc, argv, "i:")) != EOF ) Z_> { Z_> if(c == 'i'){ Z_> _addr[i] = (struct in_addr *)malloc(sizeof(struct in_addr));
а память для _addr кто выделять будет?
Z_> inet_aton (optarg, &_addr[i]);
что такое optarg?
Z_> i++; Z_> } Z_> } Z_> for( n=0; i>n; n++) Z_> printf("Index %u of %u value %s \n", n, i, inet_ntoa(_addr[n]));
Z_> for( n=0; i>n; n++) Z_> free( _addr[n] ); Z_> return 0; Z_>}
Z_>Опять таки все здорово, но на free валимся. Идеи закончились, вот обращаюсь ко многомудрым!
А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc).
Здравствуйте, Kemm, Вы писали:
K>А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc).
Да это конечно выход. При данном подходе мы добиваемся того что вся память выделяется последовательно и операции с указателя работают валидно.
Но почему не работает мой код? Я объявляю **_addr. Выделение памяти под _addr является первый вызов функции malloc т.е. для указателя _addr [со смещением i] = (указатель void) вернуть выделенную память (размером). Поправьте меня если я не прав.
Здравствуйте, Zulin_78, Вы писали:
K>>А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc). Z_>Да это конечно выход. При данном подходе мы добиваемся того что вся память выделяется последовательно и операции с указателя работают валидно. Z_>Но почему не работает мой код? Я объявляю **_addr. Выделение памяти под _addr является первый вызов функции malloc т.е. для указателя _addr [со смещением i] = (указатель void) вернуть выделенную память (размером). Поправьте меня если я не прав.
Бррр. Ты: выделяешь память под массив указателей на in_addr размером, равным размеру struct in_addr. Обычно в этой структуре только одно поле размером в 4 байта.
Надо: выделить память, достаточную для хранения N указателей на in_addr.
"Zulin_78" <52663@users.rsdn.ru> wrote in message news:1802465@news.rsdn.ru... > Захотелось написать просто динамический массив. Сначала реализовал связанный список. Все работает все хорошо, но не очень красиво и очень похоже на велосипед. Вследствие недолгих размышлений пришел к мысли (Да обязательное условие only C): >
Здравствуйте, Zulin_78, Вы писали:
Z_>Здравствуйте, Kemm, Вы писали:
K>>А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc).
Z_>Да это конечно выход. При данном подходе мы добиваемся того что вся память выделяется последовательно и операции с указателя работают валидно. Z_>Но почему не работает мой код? Я объявляю **_addr. Выделение памяти под _addr является первый вызов функции malloc т.е. для указателя _addr [со смещением i] = (указатель void) вернуть выделенную память (размером). Поправьте меня если я не прав.
ты сейчас про какой вариант говоришь?
если про первоначальный, то там _addr у тебя вообще неициализирован и запись _addr[любой i] -- ошибка.
если про второй — то память выделяется под (sizeof(struct in_addr)/sizeof(struct in_addr **)) элементов.
у меня загружен юникс, чтобы проверить сколько это, но наверняка не столько, сколько ты ожидаешь...