如何在C中复制结构的数组

如何在C中复制结构的数组,c,C,我已经定义了struct-like typedef struct { char *oidkey; int showperf; char oidrealvalue[BUFSIZE]; char *oidlimits; } struct_oidpairs; 我有一个结构数组 struct_oidpairs b[] ={{.....},....} 我想把它复制到新的结构数组a[] 请提供类似以下内容的帮助: memcpy(dest, src, sizeof(str

我已经定义了struct-like

typedef struct {
    char *oidkey;
    int showperf;
    char oidrealvalue[BUFSIZE];
    char *oidlimits;
} struct_oidpairs;
我有一个结构数组

 struct_oidpairs b[] ={{.....},....}
我想把它复制到新的结构数组a[]

请提供类似以下内容的帮助:

memcpy(dest, src, sizeof(struct) * sizeof(src));
大概是这样的:

memcpy(dest, src, sizeof(struct) * sizeof(src));
可能使用:

for(int i=0; i<b.size() ;i++) 
//I am not sure if this is the correct name for the size function
{
a[i]=b[i];
}
可能使用:

for(int i=0; i<b.size() ;i++) 
//I am not sure if this is the correct name for the size function
{
a[i]=b[i];
}

您的结构包含指针作为数据成员,这意味着您必须推出自己的复制函数,以便对指针进行合理的操作。memcpy only works是指所有与结构相关的数据都存储在结构中。

您的结构包含作为数据成员的指针,这意味着您必须推出自己的复制函数,以便对指针进行合理的操作。memcpy only works是指所有与结构相关的数据都存储在结构中。

对于内容的真实副本,请遵循的答案,然后:

for (i = 0; i < sizeof(src); i++)
{
    if (src[i].oidkey != NULL)
    {
        dest[i].oidkey = malloc(strlen(src[i].oidkey) + 1);
        strcpy(dest[i].oidkey, src[i].oidkey);
    }

    if (src[i].oidlimits != NULL)
    {
        dest[i].oidlimits = malloc(strlen(src[i].oidlimits) + 1);
        strcpy(dest[i].oidlimits, src[i].oidlimits);
    }
}
如果你对速度感兴趣,你可以考虑MimcPy。

更新:

下面是代码,我 更新代码以检查NULL 指针 这是一份引用自 : 如果出现以下情况,此解决方案将崩溃: oidkey或oidlimits是!=空而不空 “\0”-终止表示未初始化


要获得内容的真实副本,请遵循的答案,然后:

for (i = 0; i < sizeof(src); i++)
{
    if (src[i].oidkey != NULL)
    {
        dest[i].oidkey = malloc(strlen(src[i].oidkey) + 1);
        strcpy(dest[i].oidkey, src[i].oidkey);
    }

    if (src[i].oidlimits != NULL)
    {
        dest[i].oidlimits = malloc(strlen(src[i].oidlimits) + 1);
        strcpy(dest[i].oidlimits, src[i].oidlimits);
    }
}
如果你对速度感兴趣,你可以考虑MimcPy。

更新:

下面是代码,我 更新代码以检查NULL 指针 这是一份引用自 : 如果出现以下情况,此解决方案将崩溃: oidkey或oidlimits是!=空而不空 “\0”-终止表示未初始化

不制作深度副本:

struct_oidpairs b[] = {...};
size_t len = sizeof b/sizeof*b;
struct_oidpairs *a = malloc(sizeof b);

if( !a ) /* ERROR handling */

memcpy( a, b, sizeof b );
...
free( a );

不制作深度副本:

struct_oidpairs b[] = {...};
size_t len = sizeof b/sizeof*b;
struct_oidpairs *a = malloc(sizeof b);

if( !a ) /* ERROR handling */

memcpy( a, b, sizeof b );
...
free( a );


如果OIDGEY和OIDLimites是动态分配的字符串,则这将无法按预期工作。它会创建结构的浅层副本,从而复制指针,不是字符串的内容。是的,只要oidkey和oidlimits是常量,并且在复制的数组的生存期内,不会在复制的数组版本和源中更改。此memcpy与复制结构有何不同a[i]=b[i];当然,除了b码的那部分,在投票结果不好的回答中提到了吗?如果数组大小指定正确,结构复制的工作方式是否与浅层memcpy类似?如果oidkey和oidlimits是动态分配的字符串,这将不会像预期的那样工作。它会对结构进行浅层复制,从而复制指针,不是字符串的内容。是的,只要oidkey和oidlimits是常量,并且在复制的数组的生存期内,不会在复制的数组版本和源中更改。此memcpy与复制结构有何不同a[i]=b[i];当然,除了b码的那部分,在投票结果不好的回答中提到了吗?如果正确指定了数组大小,结构复制的工作方式是否与浅层memcpy类似?必须检查oidkey和oidlimits中的空指针,以避免未定义的行为,例如页面错误。您可以考虑使用GROUP代替MalC+SrcPy来减少代码行。您可以使用strdup而不是malloc+strcpy来保存代码行。如果oidkey/oidlimits被禁用,您的解决方案将崩溃=NULL和非'\0'-终止表示未初始化。@harper:strdup不是标准函数。换句话说,C中没有strdup这样的函数。您必须检查oidkey和oidlimits中的空指针,以避免未定义的行为,即页面错误。您可以考虑使用GROUP代替MalC+SrcPy来减少代码行。您可以使用strdup而不是malloc+strcpy来保存代码行。如果oidkey/oidlimits被禁用,您的解决方案将崩溃=NULL和非'\0'-终止表示未初始化。@harper:strdup不是标准函数。换句话说,C中没有像strdup这样的函数。typedef struct{…}struct_有什么意义?为什么不仅仅是结构对{…}?@JeremyP:这些在C中是不一样的。是的,它们是。区别在于,在一种情况下,您可以在结构和OID对之间键入一个空格或任意数量的空格。在另一种情况下,键入一个下划线。typedef struct{…}struct_有什么意义?为什么不仅仅是结构对{…}?@JeremyP:这些在C中是不一样的。是的,它们是。区别在于,在一种情况下,您可以在结构和OID对之间键入一个空格或任意数量的空格。在另一种情况下,键入下划线。