在施法时截断指针

时间:2014-02-18 12:16:04

标签: c pointers casting 32bit-64bit

我有以下情况:

  • 函数list_split返回一个(list_t *)
  • 我调用list_split并将返回值转换为(void **)
  • 该函数返回11054a2b8,但接收该值的var得到1054a2b8
  • 所以,似乎(list_t *)有8个字节但是(void *)ha只有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

2 个答案:

答案 0 :(得分: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?
//...

下次尝试提供一个简单完整的代码示例,每个人都可以测试它。

答案 1 :(得分:0)

我发现了问题:

  • foo 和* list_split *在不同的文件中(信息应该共享)
  • foo 定义的文件中没有* list_split *的原型

代码在32位中运行良好。就在我将其重新编译为64位时,问题出现了。我认为这是因为没有原型,编译器假定返回4字节。

谢谢你的回答。我应该分享所有信息,但我认为它不相关。