【发布时间】:2014-03-18 04:36:15
【问题描述】:
我有以下情况:
- 函数 list_split 返回一个 (list_t *)
- 我调用 list_split 并将返回值转换为 (void **)
- 函数返回 11054a2b8,但接收值的 var 得到 1054a2b8
- 所以,看起来 (list_t *) 有 8 个字节,但 (void *) 只有 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
【问题讨论】:
-
您的代码中可能存在未定义的行为:您使用
*list作为第一个参数调用list_split,但list是一个未初始化的指针(指向指针),因此取消引用它会导致未定义的行为。我希望您在真实代码中正确初始化它?也许您应该编辑您的问题以包含short and self-contained example? -
为什么不直接打印 sizeof(void*) 和 sizeof(list_t*) ?
-
如果你的 void* 是 4 个字节,那么你的 list_t* 必须是 4 个字节..
标签: c pointers casting 32bit-64bit