所以我现在明白,结构体赋值是 memcpy()
(显然,它的工作原理是为结构变量连续分配内存)和编译器的一些优化内容的组合。
但是,如果在结构定义包含指针时使用结构赋值会发生什么情况?
struct S
{
char * p;
};
char array[]="hi";
struct S s1, s2;
s1.p = array;
s2 = s1;
基于上面的代码:由于 &s1
和 &s2
所指向的内容有重叠,如 s1.p==s2.p
,当结构赋值在底层使用 memcpy()
时,不应该存在某种未定义的行为(UB)吗?
但是,https://stackoverflow.com/a/2302357/10701114 (他的答案中使用的代码示例与我的略有不同)状态:
Now the pointers of both structs point to the same block of memory - the compiler does not copy the pointed to data.
这完全偏离了我的假设:这样的结构赋值不仅可以在不调用UB的情况下工作,而且memcpy()
隐藏在当编译器不复制指向的数据而是导致指针指向引用中提到的相同内存时,结构分配无法按预期工作。
重申我的问题:如果在结构定义包含指针时使用结构赋值会发生什么?为什么我的假设是错误的?
最佳答案
当您将一个结构分配给另一个结构时,它会复制该结构每个成员的内容,无论其类型如何。
在这种情况下,结构体包含一个 char *
,因此该指针的值会从一个结构体复制到另一个结构体。执行 s2 = s1
与执行 s1.p = s2.p
完全相同。现在两个指针包含相同的值,这意味着它们指向相同的东西。
没有任何规定说两个指针不能包含相同的值。
关于c - 当结构定义具有指针时分配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60022938/