复制一个结构到另一个
我知道我可以通过成员复制结构成员,而不是我可以在结构上做一个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;
-
您可以使用结构来读取写入文件。 你不需要把它作为char *。 结构大小也将被保留。 (这一点不是最接近这个话题,但猜测它:在硬内存上的行为往往类似于内存。
-
要移动(从)到单个string字段,您必须使用
strncpy
和一个瞬态string缓冲区'\0'
终止。 某处必须记住loggingstring字段的长度。 -
要移动其他字段,可以使用点符号,例如:
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...
-
你可以将每个stringembedded一个适合它的结构,以避免点-2,并像Cobol:
NodeB->txt2fi=NodeA->txt2fi
…的行为,但你仍然需要一个短暂的string加上一个strncpy
点-2为scanf
,否则printf
运算符的input较长(较短),不会被截断(填充空格)。 -
(NodeB->insidenode_subvar).mypointer=(NodeA->insidenode_subvar).mypointer
将创build一个指针别名。 -
NodeB.txt3=NodeA.txt3
导致编译器拒绝:error: incompatible types when assigning to type 'char[3]' from type 'char *'
-
点-4只是因为
NodeB->txt2fi
&NodeA->txt2fi
属于同一个typedef
!我在C语言中find了一个正确和简单的答案,为什么在声明之后为什么不能把一个string赋给一个char数组呢? “数组(也是字符)是C中的二等公民!