gpt4 book ai didi

c - 零长度数组发生段错误

转载 作者:行者123 更新时间:2023-12-05 00:53:37 26 4
gpt4 key购买 nike

我有这个链表节点结构,它使用零长度数组来存储内存:

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)

感谢您的帮助。

最佳答案

您将 long long 值传递给您的函数,就好像它是一个有效的 void *。然后,您的函数尝试取消引用该指针(无效)以尝试复制它指向的内容。这会触发 undefined behavior导致崩溃。

你需要将atoll的返回值赋给一个局部变量,然后将该变量的地址传递给函数。

long long val = atoll(argv[1]);
t_list *l = lst_new_element((&val, sizeof(long long));

此外,使用长度为 0 的数组作为结构的最后一个成员是许多编译器用来实现灵活数组成员的扩展。执行此操作的符合标准的方法是将尺寸留空。

typedef struct s_list
{
size_t *list_size;
struct s_list *prev;
struct s_list *next;
size_t size;
char data[];
} t_list;

关于c - 零长度数组发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67620540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com