找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1887|回复: 7
收起左侧

求助找一下这个C语言结构体错误在哪里?

[复制链接]
ID:379586 发表于 2018-8-1 19:37 | 显示全部楼层 |阅读模式
  typedef struct NN  tt;
  typedef struct NN
  {
          u8 a,b,c,d,e,g,h;         

  }tt;

tt   aa[6]={10,25,34,4,5,88,75};
tt   L;
printf("%d \n",L.a);
为什么此时输出的是乱码  怎么改是才能对成员幅值
/************************/
   typedef struct NN
  {
          u8 a,b,c,d,e,g,h;         

  }aa[1]={{10,25,34,4,5,88,75}};
这种方式对结构体成员幅值问题再哪里
/*************************/
   typedef struct NN
  {
          u8 a,b,c,d,e,g,h;         

  }tt;

   tt aa[]={10,25,34,4,5,88,75};
   tt *L=aa;
  printf("%d \n",L->c);
为什么这种方式对结构体成员进行了赋值





回复

使用道具 举报

ID:380285 发表于 2018-8-1 23:45 | 显示全部楼层
我刚学C没几天,也是对结构体、指针有点弄不清楚。试着说一下:第一个不用再定义tt  L;  直接下一句:printf{"%d\n",aa->a}就可以了。我生硬地理解为:用 “->”的前面是指结构体的首地址,而“.”的前面指的是结构体的首地址对应的数据组名,不知道这样解释对不对,跟地址指针有点类似。像tt  *L=aa;表示的是指针指向的内存L地址所装载的具体数值,L是地址,aa是地址中的实际数值。其实是L=& aa;

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:330301 发表于 2018-8-2 15:38 | 显示全部楼层
第一个错误写法:tt   aa[6]={10,25,34,4,5,88,75}; //tt其实就是struct NN,这种表达的意思是定义了aa[0]-aa[5]共6个struct NN,所以后面的赋值要写成{{10,25,34,4,5,88,75},{0},{0},{0},{0},{0}}。
第二个错误写法:理解了typedef的意思就知道为什么了。
第三个写法是因为aa[]数组的首地址与第一个元素的地址是一样的,除了算数组大小和长度要注意外,其他的引用都可以认为这两个是一样的地址意义,而且数组未指定具体元素数量,你赋了一组结构体的数,自动认为就一个数组元素。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:382191 发表于 2018-8-2 15:46 | 显示全部楼层
建议看下书本  这个多用就记住了 鱼与渔
回复

使用道具 举报

ID:382189 发表于 2018-8-2 16:15 | 显示全部楼层
tt   aa[6]={10,25,34,4,5,88,75};
tt aa[6];这个首先声明的是一个结构体数组,里面的每个元素都是一个结构体。
在初始化的时候要写成这样
tt aa[6]={{1,2,3,4,5,6,7},{1,2,3,4,5,6,7}...};
类似于这样初始化
在输出的时候  要
aa[0].a  aa[0].b... 对应的是结构体数组中第一个结构体的对应元素

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:382189 发表于 2018-8-2 16:17 | 显示全部楼层
初始化和打印可以参考这个

typedef struct student {
        int a;
        int b;
}stu;
int main()
{
        stu s[3]={{1,2},{3,4},{5,6}};
        printf("%d %d\n",s[0].a,s[0].b);
        return 0;
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:379586 发表于 2018-8-2 19:59 | 显示全部楼层
在问一下二楼
tt *L=aa;  这里L除了指向数组首地址为什么还指向结构体的首地址
tt aa[]={10,25,34,4,5,88,75};  这个数组有没有指向结构体的首地址
回复

使用道具 举报

ID:390775 发表于 2018-9-3 13:02 | 显示全部楼层
tt   aa[6]={10,25,34,4,5,88,75};  
tt   L;
printf("%d \n",L.a);
定义了一个结构体数组变量aa 内含有  6个元素(结构体)  而每个结构体内的属性又是6个 相当于你只对数组中的第一个元素进行了赋值,后面默认为0, tt L;相当于定义了一个结构体变量L但是未对该变量内的成员赋值 所以是乱码 可以直接进行赋值  L.a = 16;
    typedef struct NN
  {
          u8 a,b,c,d,e,g,h;         

  }aa[1]={{10,25,34,4,5,88,75}}; 用typedef定义就是错的

   tt aa[]={10,25,34,4,5,88,75};
   tt *L=aa;
  printf("%d \n",L->c);
定义了一个数组aa[]  没给  数组大小  编译器会根据你给的初始值进行  判断  可以得到 你只初始化了一个元素  系统默认  aa只包含一个元素
tt *L = aa;  把数组的首地址赋值给L  当打印时  出来的是第一个元素的值。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表