| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1769 人关注过本帖
标题:结构体数组的赋值
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:9 
结构体数组的赋值
struct book{};

struct book a[100];
struct book temp={};//初始化并赋值

能不能直接a[i]=temp

如果可以的话,这是把a[i]的地址指向temp的地址还是和int类型一样,只給值
搜索更多相关主题的帖子: 结构体 
2014-11-24 17:10
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:7 
和int一样给值,你打印他们的地址看看就知道了

不过还是不建议这样写。

struct data
{
    char *String;
}



[fly]存在即是合理[/fly]
2014-11-24 20:50
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2 楼 azzbcc
谢谢。
为什么这么直接赋值不好?和一项一项赋有什么区别?
2014-11-26 08:39
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
收藏
得分:7 
结构体内是普通变量没问题,若有指针或数组就会有麻烦
2014-11-26 19:14
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:7 
经过自己的实验,觉得是直接复制地址,且不会内存泄露问题;
但看网上有人说如果成员有自行动态分配的指针,那就会出现野指针。但是我试验的和这个有出入
代码见下:
程序代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
    struct book{
           int no;
           int *p;
           }a[2];
           int i; 


    a[0].no=0;
    a[0].p=(int *)malloc(sizeof(int));
    *a[0].p=1;
   

    a[1]=a[0];
     printf("the a[0]'s address is %p\n",a[0].p);
    printf("the a[1]'s no is:%d\n",a[1].no);
    printf("the a[1]'s p 's value is %d\n",*(a[1].p));
    printf("the a[1]'s address is %p\n",a[1].p);
  

    return 0;
}
结果是:
the a[0]'s address is 003E2480
the a[1]'s no is:0
the a[1]'s p 's value is 1
the a[1]'s address is 003E2480
还请大神指导。
2014-11-27 09:19
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    struct data{int *p;} a, b;
    a.p = (int *)malloc(sizeof(int));
    *(a.p) = 0;

    b = a;
    printf("a.p = %p\n", a.p);
    printf("a.p = %d\n", *(a.p));
    printf("b.p = %p\n", b.p);
    printf("b.p = %d\n", *(b.p));

    *(b.p) = 1;
    printf("a.p = %p\n", a.p);
    printf("a.p = %d\n", *(a.p));
    printf("b.p = %p\n", b.p);
    printf("b.p = %d\n", *(b.p));

    free(b.p);
    printf("a.p = %p\n", a.p);
    printf("a.p = %d\n", *(a.p));
    printf("b.p = %p\n", b.p);
    printf("b.p = %d\n", *(b.p));

 
    *(b.p) = 1;
    printf("a.p = %p\n", a.p);
    printf("a.p = %d\n", *(a.p));
    printf("b.p = %p\n", b.p);
    printf("b.p = %d\n", *(b.p));

    b.p = NULL;
    printf("a.p = %p\n", a.p);
    printf("a.p = %d\n", *(a.p));
    printf("b.p = %p\n", b.p);
    printf("b.p = %d\n", *(b.p));
  
    *(b.p) = 1;
    printf("a.p = %p\n", a.p);
    printf("a.p = %d\n", *(a.p));
    printf("b.p = %p\n", b.p);
    printf("b.p = %d\n", *(b.p));

    return 0;
}



[fly]存在即是合理[/fly]
2014-11-27 11:27
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 6 楼 azzbcc
懂了,
就是直接赋值地址,所以一个改都会改,这样就造成问题,所以对于结构体里面有动态内存分配的或者指针,都不能直接赋值。
不过还想问一下,为什么free之后a,b的值都变成0了?
不是说free只是将malloc分配的内存块的控制权交给操作系统了,但是指针指向的值不变吗?

2014-11-27 18:30
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 7 楼 soulmate1023
我的和你的有点出入
#include<stdio.h>
struct temp_state_data {
                        unsigned char state[6];
                        float state_data;};


int main()
{
    int i;unsigned char temp='a';
    struct temp_state_data data[3],temp_1;
    for(i=0;i<6;i++)
        data[0].state[i]=temp++;
    data[0].state_data=1.0;

    for(i=0;i<6;i++)
        temp_1.state[i]=data[0].state[i];
    temp_1.state_data=data[0].state_data;

    data[1]=data[0];
    data[2]=temp_1;

    printf("the data address is %p\n",data);
    printf("the data[0] address is %p\n",data[0]);
    printf("the data[1] address is %p\n",data[1]);
    printf("the data[2] address is %p\n",data[2]);

    printf("the &data address is %p\n",&data);
    printf("the &data[0] address is %p\n",&data[0]);
    printf("the &data[1] address is %p\n",&data[1]);
    printf("the &data[2] address is %p\n",&data[2]);

    printf("the data[0].state address is %p\n",data[0].state);
    printf("the data[1].state address is %p\n",data[1].state);
    printf("the data[2].state address is %p\n",data[2].state);

    printf("the &data[0].state address is %p\n",&data[0].state);
    printf("the &data[1].state address is %p\n",&data[1].state);
    printf("the &data[2].state address is %p\n",&data[2].state);

    retrun 0;

}
2014-11-30 17:10
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 6 楼 azzbcc
版主,我有一点还是不明白。
不是说数组名就是地址吗。
我那段里面data和&data的地址,包括data[i].state和&data[i].state的地址就是一样的。
但是和楼上那位朋友的结果类似,data[i](i不同)的地址是相同的,data[i]和&data[i]的地址不同。
和那个朋友的区别在于,我的这个地址全是数字,而且和代码里的其他地址没有一点关联。
2014-11-30 17:13
a1920135141
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-1-18
收藏
得分:0 
回复 5楼 soulmate1023
为什么我什么都运行不出来呢?
2015-01-18 20:28
快速回复:结构体数组的赋值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016992 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved