我有一个链表节点结构,使用零长度数组来存储内存:
typedef struct s_list
{
size_t *list_size;
struct s_list *prev;
struct s_list *next;
size_t size;
char data[0];
} t_list;
(
list_size
是指向包含整个列表大小的指针)我正在使用这个函数来分配一个新节点:
static t_list *lst_new_element(void *data, size_t size)
{
t_list *new_element;
new_element = malloc(sizeof(t_list) + size);
if (!new_element)
return (NULL);
new_element->size = size;
memcpy(new_element->data, data, size); // <--- Segfault occurs here
return (new_element);
}
发生段错误是在memcpy中,但我不明白为什么,因为我分配了sizeof(t_list) + size
字节,所以应该足以对数据执行memcpy(size)
。
使用此调用导致了段错误:lst_new_element((void*)atoll(argv[1]), sizeof(long long))
(argv[1]
是5
)。
感谢帮助。
argv[1]
是"5"
(它在帖子中被写出)。 - Fayeure[]
而不是[0]
。 - Support Ukrainerealloc()
一样古老。对于许多用例来说,它们往往是成对出现的。 - BitTicklerchar arr[1];
这样的东西作为最后一个成员,然后疯狂地将其转换为某个指针或越界访问它。这被称为“结构体黑客”,是奇怪的错误和破损代码的常见来源。据我所知,gcc 在 90 年代中期发明了零长度数组来治愈“结构体黑客”。 - Lundin