2014-02-18 3 views
-1

У меня следующая ситуация:усечения указателей при литье

  • функция list_split возвращает (list_t *)
  • я называю list_split и ввергнуть возвращение к (аннулируются **)
  • Функция возвращает 11054a2b8 но переменная, которая принимает значение получает 1054a2b8
  • Таким образом, кажется, что (list_t *) имеет 8 байт, но (пустота *) га всего 4 байта

Вот код:

typedef struct node_s *list_t; 

typedef struct node_s { 
    void *el; 
    list_t tail; 
} node_t; 


list_t *list_split(list_t list, void **head) 
{ 
    if (list) { 
    *head = list->el; 
    printf(" &list->tail = %p", &list->tail)); 
    return &list->tail; 
    } 
    else { 
    *head = (void *)NULL; 
    return (list_t *)NULL; 
    } 
} 

foo() 
{ 
    void **list; 

    list = (void **)list_split(*list, &ent); 
    printf("list = %p", list)); 
} 

И выход:

&list->tail = 11054a2b8 
list = 1054a2b8 
+0

У вас есть возможное неопределенное поведение в вашем коде: вы вызываете 'list_split' с' * list' в качестве первого аргумента, но 'list' является неинициализированным указателем (на указатель), поэтому разыгрывание его приведет к неопределенному поведению. Надеюсь, вы правильно его инициализируете в своем реальном коде? Может быть, вы должны отредактировать свой вопрос, включив в него [короткий и автономный пример] (http://sscce.org/)? –

+0

Почему бы вам просто не напечатать sizeof (void *) и sizeof (list_t *)? –

+0

Если ваш void * равен 4 байтам, тогда ваш list_t * должен быть 4 байта. – 51k

ответ

0

Это совершенно непонятно, что делает этот код. Тем не менее она имеет неопределенное поведение, поскольку переменная list не была инициализирована в функции foo но (точнее *list) тестируется в функции list_split

foo() 
{ 
    void **list; // What is the value of list? 

    list = (void **)list_split(*list, &ent); // What is the value of *list? 
    printf("list = %p", list)); 
} 


list_t *list_split(list_t list, void **head) 
{ 
    if (list) { // What is the value of list? 
//... 

И в следующий раз попробуйте представить простой полный скомпилированный пример кода, который каждый мог проверить Это.

+0

список был инициализирован. Полное объявление было: void ** list = & clients ;. _clients_ указывает на связанный список. Извините за недостающую информацию. –

0

Я нашел проблему:

  • Foo и * list_split * находятся в разных файлах (инфо должны делили)
  • нет прообраза * list_split * в файле, где Foo

Код работал отлично в 32 бит. Именно тогда я перекомпилировал его на 64 бита, что проблема возникла. Я думаю, что это было потому, что без прототипа компилятор предполагает возврат в 4 байта.

Спасибо за ответчиков. Я должен поделиться всей информацией, но я не думал, что это имеет значение.

Смежные вопросы