复制一个结构到另一个

我知道我可以通过成员复制结构成员,而不是我可以在结构上做一个memcpy

这样做是可取的吗?

在我的结构中,我有一个string也作为成员,我不得不复制到具有相同成员的另一个结构。 我怎么做?

通过简单分配进行复制是最好的,因为它更短,更容易阅读,并且具有更高的抽象级别。 而不是(代码的读者)“从这里复制这些位到那里”,并要求读者考虑副本的大小参数,你只是做一个明确的任务(“复制这个值从到这里来“)。 对于尺寸是否正确可以毫不犹豫。

另外,如果结构的填充度很高,赋值可能会使编译器发出更有效的东西,因为它不需要复制填充(它知道它在哪里),但是mempcy()不会总是复制您告诉它复制的确切字节数。

如果你的string是一个真正的数组,即:

 struct { char string[32]; size_t len; } a, b; strcpy(a.string, "hello"); a.len = strlen(a.string); 

那么你仍然可以使用普通的赋值:

 b = a; 

获得完整的副本。 对于像这样build模的可变长度数据,这并不是完成复制的最有效的方法,因为整个数组总是会被复制。

但要小心,复制包含指向堆分配内存指针的结构可能有点危险,因为这样做会使指针走样 ,并且通常会在复制操作后使指针拥有者不明确。

对于这些情况来说,“深层复制”实际上是唯一的select,而且需要进行一个function。

自C90以来,您可以简单地使用:

 dest_struct = source_struct; 

只要string被存储在一个数组中:

 struct xxx { char theString[100]; }; 

否则,如果是指针,则需要手动复制。

 struct xxx { char* theString; }; dest_struct = source_struct; dest_struct.theString = malloc(strlen(source_struct.theString) + 1); strcpy(dest_struct.theString, source_struct.theString); 

如果结构是兼容的types,是的,你可以用类似的东西:

 memcpy (dest_struct, source_struct, sizeof (dest_struct)); 

唯一需要注意的是这是一个拷贝。 换句话说,如果你有一个char *指向特定的string,那么这两个结构都会指向同一个string。

并且改变其中一个string字段( char *指向的数据,而不是char *本身)的内容也会改变另一个string字段的内容。

如果你想要一个简单的副本,而不必手动做每个领域,但与非浅浅的string副本的额外奖金,使用strdup

 memcpy (dest_struct, source_struct, sizeof (dest_struct)); dest_struct->strptr = strdup (source_struct->strptr); 

这将复制结构的全部内容,然后深度复制string,从而有效地为每个结构赋予一个单独的string。

而且,如果你的C实现没有strdup (它不是ISO标准的一部分), 从这里得到一个 。

您可以使用memcpy结构,也可以将它们指定为任何其他值。

 struct {int a, b;} c, d; ca = cb = 10; d = c; 
  1. 您可以使用结构来读取写入文件。 你不需要把它作为char *。 结构大小也将被保留。 (这一点不是最接近这个话题,但猜测它:在硬内存上的行为往往类似于内存。

  2. 要移动(从)到单个string字段,您必须使用strncpy和一个瞬态string缓冲区'\0'终止。 某处必须记住loggingstring字段的长度。

  3. 要移动其他字段,可以使用点符号,例如: NodeB->one=intvar; floatvar2=(NodeA->insidebisnode_subvar).myfl;

     struct mynode { int one; int two; char txt3[3]; struct{char txt2[6];}txt2fi; struct insidenode{ char txt[8]; long int myl; void * mypointer; size_t myst; long long myll; } insidenode_subvar; struct insidebisnode{ float myfl; } insidebisnode_subvar; } mynode_subvar; typedef struct mynode* Node; ...(main) Node NodeA=malloc... Node NodeB=malloc... 
  4. 你可以将每个stringembedded一个适合它的结构,以避免点-2,并像Cobol: NodeB->txt2fi=NodeA->txt2fi …的行为,但你仍然需要一个短暂的string加上一个strncpy点-2为scanf ,否则printf运算符的input较长(较短),不会被截断(填充空格)。

  5. (NodeB->insidenode_subvar).mypointer=(NodeA->insidenode_subvar).mypointer将创build一个指针别名。
  6. NodeB.txt3=NodeA.txt3导致编译器拒绝: error: incompatible types when assigning to type 'char[3]' from type 'char *'
  7. 点-4只是因为NodeB->txt2fiNodeA->txt2fi属于同一个typedef

    我在C语言中find了一个正确和简单的答案,为什么在声明之后为什么不能把一个string赋给一个char数组呢? “数组(也是字符)是C中的二等公民!