gpt4 book ai didi

将结构复制到C中的数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:34 25 4
gpt4 key购买 nike

我在创建一个函数时遇到问题,该函数会将结构从参数添加(复制)到调整大小的数组。

这是我的简化代码:

typedef struct User
{
char FirstName[32];
char LastName[32];
}
User;



User * Users
unsigned short UsersNum = 0;

void AddUser(User * NewUser)
{
Users = (User *) realloc(Users, (UsersNum + 1) * sizeof(User));
memcpy(Users[UsersNum], NewUser, sizeof(User));
UsersNum++;
}

有了这个我得到:

error: incompatible type for argument 1 of `memcpy'

我也试过

memcpy(Users + UsersNum, NewUser, sizeof(User));

但是遇到了SEGFAULT。

如何将 NewUser 复制到 Users 的末尾?

最佳答案

首先,please don't cast the return value of malloc() in C .

第二,为什么你觉得你必须在这里使用memcpy()memcpy() 函数很棒,但它是一个相当生硬的工具,旨在“盲目地”复制程序无法识别的没有进一步结构的大面积内存。在您的情况下,您知道要复制的字节构成了 User 类型的一个实例,即它只是 User 类型的一个值。

值通常通过赋值来回移动,因此请改用它:

void AddUser(const User *NewUser)
{
User *UsersGrown = realloc(Users, (UsersNum + 1) * sizeof *Users);
if(UsersGrown != NULL)
{
Users = UsersGrown;
Users[UsersNum] = *NewUser;
++UsersNum;
}
}

您可以看到我还创建了参数 const,并添加了一些基本的错误检查,因为 realloc() 可能会失败。

最好将Users 数组的分配 大小与数组的长度 分开,这样您就可以以不同的速度增长它们并减少对 realloc() 的调用次数。换句话说,为例如房间分配空间。一开始是 8 个元素,当它被命中时,将大小加倍并 realloc(),等等。如果您期望有很多插入,这会提供更好的性能。

关于将结构复制到C中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20285118/

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