Segmentation fault ??? Help
От: Zulin_78 Россия  
Дата: 24.03.06 12:47
Оценка:
Захотелось написать просто динамический массив. Сначала реализовал связанный список. Все работает все хорошо, но не очень красиво и очень похоже на велосипед. Вследствие недолгих размышлений пришел к мысли (Да обязательное условие only C):

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <netinet/in.h>

int main(int argc, char **argv) {
struct in_addr **_addr;
int i=0, n, c;
while( (c = getopt(argc, argv, "i:")) != EOF )
{
if(c == 'i'){
_addr[i] = (struct in_addr *)malloc(sizeof(struct in_addr));
inet_aton (optarg, &_addr[i]);
i++;
}
}
for( n=0; i>n; n++)
printf("Index %u of %u value %s \n", n, i, inet_ntoa(_addr[n]));

for( n=0; i>n; n++)
free( _addr[n] );
return 0;
}

Опять таки все здорово, но на free валимся. Идеи закончились, вот обращаюсь ко многомудрым!
Re: Segmentation fault ??? Help
От: night beast СССР  
Дата: 24.03.06 12:54
Оценка:
Здравствуйте, 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 валимся. Идеи закончились, вот обращаюсь ко многомудрым!
Re[2]: Segmentation fault ??? Help
От: Zulin_78 Россия  
Дата: 24.03.06 13:09
Оценка:
Здравствуйте, night beast, Вы писали:

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;
_addr = (struct in_addr **)malloc(sizeof(struct in_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));

NB>а память для _addr кто выделять будет?


Z_>> inet_aton (optarg, &_addr[i]);


NB>что такое 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] );
free( _addr );
Z_>> return 0;
Z_>>}

Ок! добавили две строчки. Результат тот же! Кстати optarg аргумент массива аргументов модифицируемый getopt (manpage optarg).
Re[3]: Segmentation fault ??? Help
От: Kemm  
Дата: 24.03.06 13:20
Оценка:
Здравствуйте, Zulin_78, Вы писали:

Z_>_addr = (struct in_addr **)malloc(sizeof(struct in_addr));


Неправильно, надо так:
_addr = malloc(sizeof(struct in_addr *) * n);


А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc).
Re[4]: Segmentation fault ??? Help
От: Zulin_78 Россия  
Дата: 24.03.06 14:11
Оценка:
Здравствуйте, Kemm, Вы писали:

K>А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc).


Да это конечно выход. При данном подходе мы добиваемся того что вся память выделяется последовательно и операции с указателя работают валидно.
Но почему не работает мой код? Я объявляю **_addr. Выделение памяти под _addr является первый вызов функции malloc т.е. для указателя _addr [со смещением i] = (указатель void) вернуть выделенную память (размером). Поправьте меня если я не прав.
Re[5]: Segmentation fault ??? Help
От: Kemm  
Дата: 24.03.06 14:30
Оценка:
Здравствуйте, Zulin_78, Вы писали:

K>>А еще точнее, т.к. заранее неизвестно кол-во адресов, использовать realloc(3) при добавлении каждого нового адреса. Ну или сразу выделить с запасом (n = argc).

Z_>Да это конечно выход. При данном подходе мы добиваемся того что вся память выделяется последовательно и операции с указателя работают валидно.
Z_>Но почему не работает мой код? Я объявляю **_addr. Выделение памяти под _addr является первый вызов функции malloc т.е. для указателя _addr [со смещением i] = (указатель void) вернуть выделенную память (размером). Поправьте меня если я не прав.

Бррр. Ты: выделяешь память под массив указателей на in_addr размером, равным размеру struct in_addr. Обычно в этой структуре только одно поле размером в 4 байта.
Надо: выделить память, достаточную для хранения N указателей на in_addr.
Re: Segmentation fault ??? Help
От: Igore Россия  
Дата: 24.03.06 15:23
Оценка:
Здравствуйте, Zulin_78, Вы писали:

Z_> for( n=0; i>n; n++)

Z_> free( _addr[n] );
Z_> return 0;
Z_>}
А это так надо?
Re: Segmentation fault ??? Help
От: rg45 СССР  
Дата: 24.03.06 15:23
Оценка: +1
"Zulin_78" <52663@users.rsdn.ru> wrote in message news:1802465@news.rsdn.ru...
> Захотелось написать просто динамический массив. Сначала реализовал связанный список. Все работает все хорошо, но не очень красиво и очень похоже на велосипед. Вследствие недолгих размышлений пришел к мысли (Да обязательное условие only C):
>

Очередная задачка от преподавателя, который не любит STL
Автор: NoFate
Дата: 24.02.06
?
И когда он уже на пенсию свалит?
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Segmentation fault ??? Help
От: night beast СССР  
Дата: 24.03.06 15:37
Оценка:
Здравствуйте, 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 **)) элементов.
у меня загружен юникс, чтобы проверить сколько это, но наверняка не столько, сколько ты ожидаешь...
Re[6]: Segmentation fault ??? Help
От: Kemm  
Дата: 24.03.06 16:03
Оценка:
Здравствуйте, night beast, Вы писали:

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


Обычно на 1 указатель в случае 32битной архитектуры, и на 1/2 указателя, в случае 64. 8))))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.