加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

结构体变量直接赋值给结构体变量

(2012-11-29 19:29:17)
标签:

结构体拷贝

结构体赋值

结构体变量

结构体变量赋值

结构体存储方式

分类: linuxC
以前在使用结构体时没有在结构体变量之间直接赋值,今天同事在查看别人的代码时,发现有两个结构体变量直接赋值的语句当时感觉这个语句不对,认为在一个结构体里边,既有一般的无符号整形与数组,因为数组的赋值是不能直接赋值,要内存拷贝,从这里推理所以认为这个语句不对。于是问了一下,我当时以为是结构体指针变量的赋值,认为没有问题。还和同事争论了一番,当他让我看源代码时,发现是变量间的直接赋值,下意识中的判断是不对,原因就和之前他理解的一样。

于是晚上到住处在网上查了一下,说是可以的,因为是同样的数据类型,而C语言在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,这里因为同样结构体变量,属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的。
同时敲了一段很简单的代码测试一下,看到底是为什么。发现确实是这样。那么C语言在变量间的赋值是如何进行的呢?

再查找发现在C中一个变量名其实就是一个地址对应着一块内存的起始地址,赋值操作符就是找到这块内存的起始地址。

网上一个关于结构体变量复制的帖子
#include

typedef struct
{
     unsigned char a;
     unsigned char b;
     unsigned char c;
     unsigned char d[10];
}TestStruct;

int main(void)
{
     TestStruct a = {0};
     TestStruct b = {0};

     a.a = 1;
     a.b = 2;
     a.c = 3;
     a.d[2] = 5;

     b = a;

     printf("a.a:%d \n a.b:%d \n a.c:%d \n a.d[2]:%d \n", a.a, a.b, a.c, a.d[2]);

     printf("b.a:%d \n b.b:%d \n b.c %d \n b.d[2]:%d \n", b.a, b.b, b.c, b.d[2]);

     return 0;

}

http://hi.csdn.net/attachment/201202/14/0_1329198357O8Gt.gif



当然结构体数组也可以直接赋值给结构体数组,方法类似,程序如下:

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


typedef struct param{

    int a;

    int b;

    int c;

}param_t;


param_t global_param[3];


int main()

{

     param_t lbs_param[3];

     int i;

     global_param[0].a = 1;

     global_param[0].b = 2;

     global_param[0].c = 3;

     global_param[1].a = 4;

     global_param[1].b = 5;

     global_param[1].c = 6;

     global_param[2].a = 7;

     global_param[2].b = 8;

     global_param[2].c = 9;

    

     for(i = 0; i < 3; i++)

     {   

         lbs_param[i] = global_param[i];

     }   

     for(i = 0; i < 3; i++)

     {   

        printf("%d : %d,%d,%d\n",i,lbs_param[i].a,lbs_param[i].b,lbs_param[i].c);

     }   

    return 0;

}






输出结果为:
[root@localhost tmp]# ./a.out 
0 : 1,2,3
1 : 4,5,6
2 : 7,8,9

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有