Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ANCI C: Ошибка сегментирования 
V
    Опции темы
n4nv4n
Дата 26.10.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Есть ф-ция получения mac-адреса, которая возвращает структуру:

Код

struct ethip
{
    u_char ar_sha[6];    /* sender hardware address */
    u_char ar_spa[4];    /* sender protocol address */
    u_char ar_tha[6];    /* target hardware address */
    u_char ar_tpa[4];    /* target protocol address */
};


Я пытаюсь вывести через printf элементы массива

Код

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",host1->ar_sha[0],host1->ar_sha[1],host1->ar_sha[2],host1->ar_sha[3],host1->ar_sha[4],host1->ar_sha[5]);


На что получаю ошибку сегментирования, но если я делаю вывод циклом ниже, то все хорошо:

Код

for(i = 0; i < 6; i++)
        printf("[%d] %02x\n", i, host1->ar_sha[i]);


При отладке через gdb, в случаи с оператором printf (без цикла) ошибка в строке 
Код

memcpy(addrs->ar_sha, arp_hdr->ar_sha, 6);
 
это строка из ф-ции getmac, а addrs это эта структура которая возвращается.


Почему так проиcходит?

Это сообщение отредактировал(а) n4nv4n - 26.10.2009, 11:54
PM MAIL   Вверх
Earnest
Дата 26.10.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(n4nv4n @  26.10.2009,  12:53 Найти цитируемый пост)
это строка из ф-ции getmac, а addrs это эта структура которая возвращается.
Почему так проиcходит?

Так ошибка не на операторе printf? А функция вызывается до или после? Ты бы код поподробнее привел...



--------------------
...
PM   Вверх
n4nv4n
Дата 28.10.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Earnest код большой. Вообщем проблема ушла когда я перестал использовать ссылки на структуры.
Т.е. ф-ция getmac возвращала ссылку на структуру struct ethip *getmac, теперь я поменял все, т.е. struct ethip getmac и все пучком. 
Сама ф-ция getmac вызывалась до, т.е. она возвращала ( по старому ) ссылку на структуру и потом я вывод делал принтом ( в main ), после чего вылетало, я компилил с -ggdb опцией, потом сморел через отладчик по шагам о прога вылета не на принте а на ф-ции memcpy(addrs->ar_sha, arp_hdr->ar_sha, 6); в ф-ции getmac, но если я делал принт в getmac() после того как memcpy скопировало байты, а в main из которой вызывал getmac убрал принты, вывод был без ошибок. Мне самум проста эта ситуация не ясна, или это фишки компилятора, хз.
Все решилось отказом от возврата указателей на структуру.
Код


#include <stdio.h>

struct nums
{
    int x;
    int y;
};

int main(void)
{
    struct nums *n;
    
    n->x = 1;
    n->y = 2;
    
    printf("%d\n", n->x);
}


Этот код при исполнении возвращает ошибку сегментирования. Я наверняка что та делаю нитак -smile

Это сообщение отредактировал(а) n4nv4n - 28.10.2009, 10:17
PM MAIL   Вверх
zim22
Дата 28.10.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(n4nv4n @  28.10.2009,  09:15 Найти цитируемый пост)
 Я наверняка что та делаю нитак 

память не выделяешь под указатель 
Код

struct nums *n;



--------------------
PM MAIL   Вверх
n4nv4n
Дата 28.10.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



zim22 спс, фурикает.

Код

#include <stdio.h>
#include <stdlib.h>

struct nums
{
    int x;
    int y;
};
int main(void)
{
    struct nums *n;
    
    if( (n = malloc(sizeof(struct nums))) == NULL )
    {
        fprintf(stderr, "malloc() failed\n");
        exit(0);
    }
    
    n->x = 1;
    n->y = 2;
    
    printf("%d\n", n->y);

    return 0;
}


Это сообщение отредактировал(а) n4nv4n - 28.10.2009, 17:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.