c - 当结构定义具有指针时分配结构

标签 c pointers struct

所以我现在明白,结构体赋值是 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/

相关文章:

c - 在 C 中使用 strtok 将日期字符串转换为整数

c - #define Printf() 字符串中的预处理器替换

pointers - 在 golang 中返回一个指针

c# - 什么是定义站点中的引用结构

c - 如何在 typedef struct 中使用 int 数组 (C)

C:错误端口上的套接字绑定(bind)

java - 打印到终端而不滚动

c# - 在 C# 中设置对 null 的引用

C++ - 方法实现取决于是否设置了成员引用变量

c - 将数据添加到使用 C 中的 2 个结构实现的堆栈 : moving pointers