两个相同的结构体变量 是否可以直接赋值???

时间:2022-09-30 13:59:56
比如结构体A,里面有结构体,有指针,有各种int char 变量。现在有A a; A b;  a = b; 这样赋值是否可以,安全??

22 个解决方案

#1


memcpy()函数实现吧!

#2


在C++里面很少见到 一般都是用重载赋值运算符实现的

#3


有指针的情况下会指向同一个地址,如果想完全复制的话还是要自己重载赋值或拷贝函数。

#4


我的是C不是C++
memcpy()函数,这个OK吧~~

#5


可以~ 不过最好还是 
A *a;
A *b;
a=b;

#6


引用 4 楼 shisi 的回复:
我的是C不是C++
memcpy()函数,这个OK吧~~


这样用可以的,但是你要注意内部指针的问题

#7


指针会进行浅copy 指向同样的地方
其他成员数据的值都等于b的值

一般没有指针等数据的 可以这样做

如果有指针内存分配等 如析构等情况会崩溃的

#8


不会装会 纯乱说

#9


指针不是分配的,指针也是指向一个已经分配好的内存~

#10


有指针的话不能这样分配, 
如果这样分配的话就成了浅拷贝

#11


完全可以啊,结构体变量也是变量啊。

#12


如果包含指针,赋值只能实现浅拷贝。被赋值的结构体变量的指针成员与原结构体变量的指针成员指向一个地址。

#include <stdio.h>

struct s
{
    int i;
    char c;
    void* p;
};

int main()
{
    struct s s1, s2;
    char * s = "rabbit is cute";
    s1.i = 345;
    s1.c = 'y';
    s1.p = (void*)s;

    s2 = s1;

    printf("s2: %d, %c, %s\n", s2.i, s2.c, s2.p);
    printf("s1 ptr: %d; s2 ptr: %d\n", s1.p, s2.p);

    return 0;
}

输出结果是s1.p的值和s2.p的值是一样的。可见字符串没有被拷贝,两个指针指向同一个字符串。

#13


在C里面的结构体不可以直接直接赋值,不过可以按元素赋值~

#14


c++里重载了赋值运算符,可以直接用 =
C里用memcpy()

#15


可以,我记得我们老师上课有讲过

#16


12楼正解

#17


直接赋值可以,编译没有问题。编译器处理时采用位拷贝,这样两个结构体变量内的指针就指向同一个内存单元了,同时如果结构体有填充,填充的垃圾数据也原样拷贝了。而结构体内指针一般是动态分配内存和动态释放空间,这样处理很不安全。最好不要这样做。

#18


引用 13 楼 athenacle_ 的回复:
在C里面的结构体不可以直接直接赋值,不过可以按元素赋值~


我认为最好是这样

#19


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

#20


谢谢各位了~~

#21


学习了~

#22


可以直接赋值的

#1


memcpy()函数实现吧!

#2


在C++里面很少见到 一般都是用重载赋值运算符实现的

#3


有指针的情况下会指向同一个地址,如果想完全复制的话还是要自己重载赋值或拷贝函数。

#4


我的是C不是C++
memcpy()函数,这个OK吧~~

#5


可以~ 不过最好还是 
A *a;
A *b;
a=b;

#6


引用 4 楼 shisi 的回复:
我的是C不是C++
memcpy()函数,这个OK吧~~


这样用可以的,但是你要注意内部指针的问题

#7


指针会进行浅copy 指向同样的地方
其他成员数据的值都等于b的值

一般没有指针等数据的 可以这样做

如果有指针内存分配等 如析构等情况会崩溃的

#8


不会装会 纯乱说

#9


指针不是分配的,指针也是指向一个已经分配好的内存~

#10


有指针的话不能这样分配, 
如果这样分配的话就成了浅拷贝

#11


完全可以啊,结构体变量也是变量啊。

#12


如果包含指针,赋值只能实现浅拷贝。被赋值的结构体变量的指针成员与原结构体变量的指针成员指向一个地址。

#include <stdio.h>

struct s
{
    int i;
    char c;
    void* p;
};

int main()
{
    struct s s1, s2;
    char * s = "rabbit is cute";
    s1.i = 345;
    s1.c = 'y';
    s1.p = (void*)s;

    s2 = s1;

    printf("s2: %d, %c, %s\n", s2.i, s2.c, s2.p);
    printf("s1 ptr: %d; s2 ptr: %d\n", s1.p, s2.p);

    return 0;
}

输出结果是s1.p的值和s2.p的值是一样的。可见字符串没有被拷贝,两个指针指向同一个字符串。

#13


在C里面的结构体不可以直接直接赋值,不过可以按元素赋值~

#14


c++里重载了赋值运算符,可以直接用 =
C里用memcpy()

#15


可以,我记得我们老师上课有讲过

#16


12楼正解

#17


直接赋值可以,编译没有问题。编译器处理时采用位拷贝,这样两个结构体变量内的指针就指向同一个内存单元了,同时如果结构体有填充,填充的垃圾数据也原样拷贝了。而结构体内指针一般是动态分配内存和动态释放空间,这样处理很不安全。最好不要这样做。

#18


引用 13 楼 athenacle_ 的回复:
在C里面的结构体不可以直接直接赋值,不过可以按元素赋值~


我认为最好是这样

#19


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

#20


谢谢各位了~~

#21


学习了~

#22


可以直接赋值的