gpt4 book ai didi

c - c中的memcpy后断言失败

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:56 26 4
gpt4 key购买 nike

我有一个函数可以为某个数组创建副本。我的代码的结构是:

typedef struct {
int* data;
unsigned int len;
} intarr_t;

我写的函数是:

intarr_t* intarr_copy( const intarr_t* ia )
{
unsigned int len;
intarr_t* newia = malloc(sizeof(intarr_t));
assert (newia);
newia->data = malloc(sizeof(int)*len);
newia->len = len;
if (newia == 0)
{
return NULL;
}
else
{
memcpy (newia->data, ia->data, len*sizeof(int));
}
return 0;
}

当我测试函数时,它停止了我的函数并说我对 ia 的断言失败了。我唯一拥有 ia 的地方是 memcpy。但是我什至没有在我的函数中做断言。有人知道为什么它给我一个断言错误吗?

最佳答案

您看到崩溃的原因是:

memcpy (newia->data, ia->data, len*sizeof(int));

在这一行中,len 的值是不确定的,因此您会看到崩溃。我们还看到 len 未初始化并在函数的多个位置使用,这是不正确的,因为 len 的值在没有初始化的情况下将是不确定的。

此外,您的代码中还有许多多余的东西。

在调用 malloc() 后立即检查内存分配成功或失败

intarr_t* newia = malloc(sizeof(intarr_t));

if(newia == NULL)
{
printf("Memory allocation failed\n");
return;
}

因此,这样做不会访问无效内存。

接下来,您的命名约定太差了。你必须有可读的 typedef 而不是像intarr_t.

关于c - c中的memcpy后断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27087158/

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