gpt4 book ai didi

c++ - 对于具有 char[] 的结构,浅拷贝是否足够?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:52 28 4
gpt4 key购买 nike

我有一个包含字符数组的结构,没有任何其他成员函数。我正在这些结构的两个实例之间进行赋值操作。如果我没记错的话,它正在做浅拷贝。在这种情况下浅拷贝安全吗?

我已经在 C++ 中尝试过它并且它有效,但我只想确认这种行为是否安全。

最佳答案

如果通过“浅拷贝”,你的意思是在分配一个包含数组的 struct 之后,该数组将指向原始 struct 的数据,然后:它不能。数组的每个元素都必须复制到新的 struct 中。如果你的结构有指针,“浅拷贝”就会出现。否则,您不能进行浅拷贝。

当您将包含数组的 struct 分配给某个值时,它不能进行浅拷贝,因为这意味着分配给数组,这是非法的。因此,您获得的唯一拷贝是深拷贝。

考虑:

#include <stdio.h>

struct data {
char message[6];
};

int main(void)
{
struct data d1 = { "Hello" };
struct data d2 = d1; /* struct assignment, (almost) equivalent to
memcpy(&d2, &d1, sizeof d2) */

/* Note that it's illegal to say d2.message = d1.message */

d2.message[0] = 'h';
printf("%s\n", d1.message);
printf("%s\n", d2.message);
return 0;
}

以上将打印:

Hello
hello

另一方面,如果您的 struct 有一个指针,struct 赋值将只复制指针,这是“浅拷贝”:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct data {
char *message;
};

int main(void)
{
struct data d1, d2;
char *str = malloc(6);
if (str == NULL) {
return 1;
}
strcpy(str, "Hello");
d1.message = str;
d2 = d1;

d2.message[0] = 'h';
printf("%s\n", d1.message);
printf("%s\n", d2.message);
free(str);
return 0;
}

以上将打印:

hello
hello

一般来说,给定struct T d1, d2;d2 = d1;等价于memcpy(&d2, &d1, sizeof d2);,但如果结构有填充,则可能会或可能不会被复制。

编辑:在 C 中,您 can't assign to arrays .鉴于:

int data[10] = { 0 };
int data_copy[10];

data_copy = data;

是非法的。因此,正如我上面所说,如果您在 struct 中有一个数组,则分配给结构 必须复制数组中的数据元素。在这种情况下您不会得到浅拷贝:将术语“浅拷贝”应用于这种情况没有任何意义。

关于c++ - 对于具有 char[] 的结构,浅拷贝是否足够?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241699/

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