Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ANCI C: Ошибка сегментирования


Автор: n4nv4n 26.10.2009, 11:53
Есть ф-ция получения 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ходит?

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

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

Автор: n4nv4n 28.10.2009, 10:15
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

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

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

struct nums *n;

Автор: n4nv4n 28.10.2009, 17:49
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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)