注册 登录
编程论坛 数据结构与算法

结构体数组的赋值

lyl930130 发布于 2014-11-24 17:10, 1769 次点击
struct book{};

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

能不能直接a[i]=temp

如果可以的话,这是把a[i]的地址指向temp的地址还是和int类型一样,只給值
9 回复
#2
azzbcc2014-11-24 20:50
和int一样给值,你打印他们的地址看看就知道了

不过还是不建议这样写。

struct data
{
    char *String;
}

#3
lyl9301302014-11-26 08:39
回复 2 楼 azzbcc
谢谢。
为什么这么直接赋值不好?和一项一项赋有什么区别?
#4
巧若拙2014-11-26 19:14
结构体内是普通变量没问题,若有指针或数组就会有麻烦
#5
soulmate10232014-11-27 09:19
经过自己的实验,觉得是直接复制地址,且不会内存泄露问题;
但看网上有人说如果成员有自行动态分配的指针,那就会出现野指针。但是我试验的和这个有出入
代码见下:
程序代码:
#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
还请大神指导。
#6
azzbcc2014-11-27 11:27
程序代码:
#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;
}

#7
soulmate10232014-11-27 18:30
回复 6 楼 azzbcc
懂了,
就是直接赋值地址,所以一个改都会改,这样就造成问题,所以对于结构体里面有动态内存分配的或者指针,都不能直接赋值。
不过还想问一下,为什么free之后a,b的值都变成0了?
不是说free只是将malloc分配的内存块的控制权交给操作系统了,但是指针指向的值不变吗?

#8
lyl9301302014-11-30 17:10
回复 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;

}
#9
lyl9301302014-11-30 17:13
回复 6 楼 azzbcc
版主,我有一点还是不明白。
不是说数组名就是地址吗。
我那段里面data和&data的地址,包括data[i].state和&data[i].state的地址就是一样的。
但是和楼上那位朋友的结果类似,data[i](i不同)的地址是相同的,data[i]和&data[i]的地址不同。
和那个朋友的区别在于,我的这个地址全是数字,而且和代码里的其他地址没有一点关联。
#10
a19201351412015-01-18 20:28
回复 5楼 soulmate1023
为什么我什么都运行不出来呢?
1