注册 登录
编程论坛 C语言论坛

结构体里嵌套一个结构体数组指针

数据总线 发布于 2020-07-02 17:15, 10632 次点击
typedef struct
{
    unsigned char x;
    unsigned char y;
    unsigned char mode;
    char  *str;
}seat_s;

typedef struct
{
    seat_s *seat[3];
    unsigned char a;      
    unsigned char b;
}MENU_s;

MENU_s  Top_Mode;   
请教一下怎样访问seat_s这个结构体里边的每个成员,及初始化???

52 回复
#2
lin51616782020-07-02 17:17
那是野指针 不能访问 也谈不上初始化
#3
ditg2020-07-02 17:54

谈不上野指针吧,见过类似的应用
#4
纯蓝之刃2020-07-02 19:21
程序代码:
#include<stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct
{
    unsigned char x;
    unsigned char y;
    unsigned char mode;
    char  *str;
}seat_s;

typedef struct
{
    seat_s *seat[3];
    unsigned char a;
    unsigned char b;
}MENU_s;

int main()
{
    MENU_s  Top_Mode;

    seat_s seat;

    for(int i=0;i<3;i++)
        Top_Mode.seat[i]=malloc(sizeof(seat_s));

    //假设此时seat已经赋值
    memcpy(Top_Mode.seat[0],&seat,sizeof(seat_s));

    //假设此时seat改变
    memcpy(Top_Mode.seat[1],&seat,sizeof(seat_s));

    //同上
    memcpy(Top_Mode.seat[2],&seat,sizeof(seat_s));

    return 0;
}


大概就是这样,先分配一个空间给seat_s *seat[3];指针,然后使用一个临时seat_s变量接收到数据,然后将该临时变量的值赋给seat_s *seat[3]指针指向的空间。
#5
数据总线2020-07-02 19:33
回复 4楼 纯蓝之刃
谢谢指点
#6
lin51616782020-07-02 19:48
以下是引用ditg在2020-7-2 17:54:20的发言:


谈不上野指针吧,见过类似的应用

指针没初始化 就是野指针了
如果这是全局变量也就NULL 不过区别不大

和有没有类似应用没关系
#7
ditg2020-07-02 23:37

哦,以前没使用过野指针这个词,估计以后也不大会使用了,呵呵
#8
数据总线2020-07-03 08:25
其实是一个结构体里边嵌套了另外一个结构体数组的指针
#9
lin51616782020-07-03 09:00
以下是引用ditg在2020-7-2 23:37:50的发言:


哦,以前没使用过野指针这个词,估计以后也不大会使用了,呵呵

用不用是你的事
沟通不顺利就是你自己的问题了

[此贴子已经被作者于2020-7-3 09:38编辑过]

#10
八画小子2020-07-03 10:21
以下是引用ditg在2020-7-2 23:37:50的发言:


哦,以前没使用过野指针这个词,估计以后也不大会使用了,呵呵


谁闲得没事干用野指针?
#11
八画小子2020-07-03 10:22
程序代码:
typedef struct
{
    unsigned char x;
    unsigned char y;
    unsigned char mode;
    char  *str;
}seat_s;

typedef struct
{
    seat_s seat[3];
    unsigned char a;      
    unsigned char b;
}MENU_s;

MENU_s  Top_Mode;  


有的时候,这种会更好一些。
#12
ditg2020-07-03 10:56

1. 就算是沟通问题吧

2. 并不是谁闲着没事干,linux早期内核在struct task_struct进程结构里就有,最新内核里也不少

#define NR_OPEN 20

struct task_struct {
    ......
    struct file *filp[NR_OPEN];
    ......
};
#13
lin51616782020-07-03 11:17
以下是引用ditg在2020-7-3 10:56:26的发言:


1. 就算是沟通问题吧

2. 并不是谁闲着没事干,linux早期内核在struct task_struct进程结构里就有,最新内核里也不少

#define NR_OPEN 20

struct task_struct {
    ......
    struct file *filp[NR_OPEN];
    ......
};

搞清楚 结构体里面有指针 和 用野指针是两回事
#14
ditg2020-07-03 11:18
在使用过程中找不到指定地址,我认为叫野指针
#15
lin51616782020-07-03 11:29
以下是引用ditg在2020-7-3 11:18:46的发言:

在使用过程中找不到指定地址,我认为叫野指针

那么 内核里面 这个结构体里面的指针数组不存在使用的时候 找不到指定地址的情况
那么 内核里面 这个结构体里面的指针数组不是野指针
我这样说你能理解吗

内核里面的这个结构体和这个问题的区别是
MENU_s  Top_Mode;
这里定义了一个MENU_s类型的结构体变量并且没初始化 也没有给指针成员赋值
然后 题主就想要 访问seat_s这个结构体里边的每个成员

想要访问没初始化的指针 所以我说野指针

明白了没有
扯上内核也算是迷路了
感觉你一直不懂我在说什么
#16
ditg2020-07-03 11:31

楼主才定义,还没使用呢,跟野不野没啥关系
#17
lin51616782020-07-03 11:32
以下是引用ditg在2020-7-3 11:31:37的发言:


楼主才定义,还没使用呢,跟野不野没啥关系

请教一下怎样访问seat_s这个结构体里边的每个成员,及初始化???
自行体会
#18
ditg2020-07-03 11:44
前面有位版主大概示范了应用部分,虽然大家可能都不喜欢听,但源码里是通过另开一块内存数组,跟版主示范的临时分配差不多,这个是应用部分;

初始化部分可以自行查看进程0的#define

[此贴子已经被作者于2020-7-3 11:47编辑过]

#19
lin51616782020-07-03 11:50
以下是引用ditg在2020-7-3 11:44:18的发言:

前面有位版主大概示范了应用部分,虽然大家可能都不喜欢听,但源码里是通过另开一块内存数组,跟版主示范的临时分配差不多,这个是应用部分;

初始化部分可以自行查看进程0的#define

你描述的是 怎么解决野指针这个问题的具体操作
和我的说法没什么冲突

问题 怎么访问
我回答 因为是野指针所以无法访问
纯蓝之刃 可以通过分配一个空间给seat_s *seat[3];指针(即处理野指针的问题) 然后访问

你的理解需要提高 加油
#20
ditg2020-07-03 11:51

呵呵
#21
lin51616782020-07-03 11:56
以下是引用ditg在2020-7-3 11:51:40的发言:


呵呵

没初始化 没赋值的指针 叫做野指针
版主和内核都给指针赋值
所以不是野指针 有什么问题

有什么意见请说出来讨论
阴阳怪气的呵呵 对学习没有帮助
并且显得你小肚鸡肠 没有端正的学习心态
#22
八画小子2020-07-03 13:30
野指针的问题,个人觉得和编码者的能力有很大的关系。在高内聚低耦合的模块化的前提下,如果编码者能力非常强,可以在逻辑上完全排除野指针产生的影响和BUG,那么,即便在代码中处处遗留野指针又能如何?
当然如果相关代码需要被他人使用,那么就需要做到严谨,不留一个野指针。
野指针的概念其实就是因为编码不严谨、逻辑不严密,然后为了降低BUG出现做的一致性处理。
当然,如何看代野指针,每个人都有自己的独到之处。不过,读百家之代码,吸取其精华及精妙之处,调自身之BUG,做到尽可能地提升自己地编码和逻辑能力,才是大家共识的王道。
#23
ditg2020-07-03 15:39

正常沟通交流没有问题,是非对错实在不愿评说……
#24
lin51616782020-07-03 15:57
以下是引用ditg在2020-7-3 15:39:23的发言:


正常沟通交流没有问题,是非对错实在不愿评说……

这个帖子的大部分回复是我在帮你解释野指针
正常沟通很成问题
坦白说 正常的话 根本不应该存在这段沟通
题主问 怎么访问
我说 野指针 不能访问
要么就不管我
要么就说哦
要么就帮题主解释一下怎么处理野指针的错误
这三种情况 你能正确理解野指针的时候的正常沟通

而不是说 谈不上野指针
#25
ditg2020-07-03 16:04

比如吧,楼主写的具体哪个地方是野指针?
#26
lin51616782020-07-03 16:11
以下是引用ditg在2020-7-3 16:04:50的发言:


比如吧,楼主写的具体哪个地方是野指针?

楼主定义了
MENU_s  Top_Mode;
要访问 seat_s的成员
因为
Top_Mode.seat[0]
Top_Mode.seat[1]
Top_Mode.seat[2]
既没有初始化 也没有赋值
所以 这三个指针都是野指针
所以不能访问 seat_s的成员

所以咯 你直到现在还不知道我说的野指针在哪里
这不是沟通很有问题吗
#27
ditg2020-07-03 16:32

问“请教一下怎样访问seat_s这个结构体里边的每个成员,及初始化”,我觉得楼主在问“这个定义的结构体变量Top_Mode怎样初始化”

答:“那是野指针 不能访问 也谈不上初始化

我认为:可以访问只是结果可能随机,因为没有使用(后面纯版写了个程序,执行过程中进行赋值),所以没有野指针的问题,换句话说,定义了一个指针变量,但是没有赋初值,是否就叫野指针?
#28
lin51616782020-07-03 16:43
以下是引用ditg在2020-7-3 16:32:45的发言:


问“请教一下怎样访问seat_s这个结构体里边的每个成员,及初始化”,我觉得楼主在问“这个定义的结构体变量Top_Mode怎样初始化”

答:“那是野指针 不能访问 也谈不上初始化”

我认为:可以访问只是结果可能随机,因为没有使用(后面纯版写了个程序,执行过程中进行赋值),所以没有野指针的问题,换句话说,定义了一个指针变量,但是没有赋初值,是否就叫野指针?

访问seat_s这个结构体里边的每个成员
你可能没有发现 这里有2个结构体类型seat_s 和 MENU_s
楼主定义了一个 MENU_s变量 问的是访问seat_s的成员 我不知道你误解了什么
对于楼主定义的MENU_s变量 没有创建seat_s 更谈不上访问seat_s是成员 创建的是3个seat_s的指针

不是可以访问但结果随机
你可以访问seat_s
但不能访问seat_s的成员
能理解这两个说法的区别吗
访问 seat_s
比如
Top_Mode.seat[0] = NULL;
这个做法是完全没问题的

但是访问 seat_s的成员指的是
Top_Mode.seat[0]->x = 0;
这是野指针操作 明白了吗

为什么这么简单的东西都需要我仔仔细细的解释
你就不能自己仔细看题好好理解吗
#29
ditg2020-07-03 17:02

楼主MENU_s  Top_Mode;   时已经分配好内存了,所以纯版后面用代码进行赋值,再换一句话说,都能赋值了,前面不能初始化吗?还有上面又变野指针“操作”了,到底定义时叫野指针,还是“操作”使用时叫野指针,你到底在说啥?
#30
lin51616782020-07-03 17:11
以下是引用ditg在2020-7-3 17:02:57的发言:


楼主MENU_s  Top_Mode;   时已经分配好内存了,所以纯版后面用代码进行赋值,再换一句话说,都能赋值了,前面不能初始化吗?还有上面又变野指针“操作”了,到底定义时叫野指针,还是“操作”使用时叫野指针,你到底在说啥?

定义了Top_Mode
写Top_Mode.seat[0] 没问题
读Top_Mode.seat[0] 是你说的结果可能随机
但楼主问的不是 读写Top_Mode.seat[0]
楼主问的是 读写Top_Mode.seat[0]->x
这就是解引用野指针操作了



[此贴子已经被作者于2020-7-3 17:12编辑过]

#31
ditg2020-07-03 17:13

水平低
#32
lin51616782020-07-03 17:30
以下是引用ditg在2020-7-3 17:13:47的发言:


水平低

你的确水平低了些 需要加油了
主要是理解能力方面的问题

楼主问 读写Top_Mode.seat[0]->x
你一直没看出来 一直按照 读写Top_Mode.seat[0] 理解
我明明白白说了三次 读写Top_Mode.seat[0]->x 你都不清不楚
努力吧 多思考有利于缓解这样的现象
#33
ditg2020-07-03 17:33

多思考“的确”有利于缓解这样的现象,与君共勉
#34
lin51616782020-07-03 17:38
以下是引用ditg在2020-7-3 17:13:47的发言:


水平低

顺便你一直不理解 什么是野指针
野指针是描述指针变量的一个状态
是一个状态 不是一个错误
当指针处于野指针这个状态的时候
不应该对这个指针做读取操作 也不能对这个指针做解引用的操作
程序代码:
int* p; //假设p是局部变量
if(p == NULL);//读野指针

int* p; //假设p是局部变量
*p = 0; // 解引用野指针

这两个操作是错的
但是 写操作是没什么问题

我从来没说过 p是野指针 所以是错的
我说的是 因为是野指针 所以不能通过这个指针访问结构体成员(涉及到解引用野指针)


[此贴子已经被作者于2020-7-3 17:53编辑过]

#35
ditg2020-07-03 18:08

反正吧,咬死口,千万别换……假设我不会也不懂野指针
#36
lin51616782020-07-03 18:25
回复 35楼 ditg
不服?
那你正面回复我呗
我哪一楼哪句话 哪个字写错了
请指点
#37
八画小子2020-07-03 18:34
以下是引用lin5161678在2020-7-3 17:38:25的发言:


顺便你一直不理解 什么是野指针
野指针是描述指针变量的一个状态
是一个状态 不是一个错误
当指针处于野指针这个状态的时候
不应该对这个指针做读取操作 也不能对这个指针做解引用的操作
int* p; //假设p是局部变量
if(p == NULL);//读野指针

int* p; //假设p是局部变量
*p = 0; // 解引用野指针

这两个操作是错的
但是 写操作是没什么问题

我从来没说过 p是野指针 所以是错的
我说的是 因为是野指针 所以不能通过这个指针访问结构体成员(涉及到解引用野指针)



【【【【【【【
int* p; //假设p是局部变量
*p = 0; // 解引用野指针

这两个操作是错的
但是 写操作是没什么问题
】】】】】】】】
其实,严格地说这个地方确实有点问题,但和你们讨论的问题没有太大关系。*p = 0;这一句可能会发生段错误,本质却和野指针的道理是一样的。
#38
lin51616782020-07-03 18:36
回复 37楼 八画小子
我后面写了 这两个操作都是错了
#39
八画小子2020-07-03 18:39
其实,感觉,你们讨论问题的没有太大意义。对于相对熟练的C程序猿,通常知道怎么问题是怎么产生的,也知道怎么规避这个问题。对于新手小白,就是扇两巴掌都不知道自己错在哪里了。
还是那句话,争论两句即可,点到为止就可以了。毕竟编码能力不是靠争论的来的,只要自己明白自己写的代码中没有BUG就可以了。就像我之前说的,只要程序逻辑上完全规避了野指针,即便满篇是野指针,又能怎样?
大家以和为贵,没必要争口舌之胜。
#40
lin51616782020-07-03 18:46
以下是引用八画小子在2020-7-3 18:39:41的发言:

其实,感觉,你们讨论问题的没有太大意义。对于相对熟练的C程序猿,通常知道怎么问题是怎么产生的,也知道怎么规避这个问题。对于新手小白,就是扇两巴掌都不知道自己错在哪里了。
还是那句话,争论两句即可,点到为止就可以了。毕竟编码能力不是靠争论的来的,只要自己明白自己写的代码中没有BUG就可以了。就像我之前说的,只要程序逻辑上完全规避了野指针,即便满篇是野指针,又能怎样?
大家以和为贵,没必要争口舌之胜。

看看他的回复里面有多少个呵呵
理解错了还阴阳怪气
怪不得我不停打脸了
#41
ditg2020-07-03 18:50
你:“指针没初始化 就是野指针了”、“没初始化 没赋值的指针 叫做野指针”
        “我从来没说过 p是野指针”(引自int* p;)

我:“定义了一个指针变量,但是没有赋初值,是否就叫野指针?” - 如果,当然是如果概念可以类推的话,那么int c;应该叫野整型,等等
       “哦,以前没使用过野指针这个词,估计以后也不大会使用了,呵呵” - 刚分配完一个内存空间,我不会叫它野指针,今天不会,以后还是不会,我还是只会叫它一个指针变量,这个指针变量可能没有初始化,内容为一个随机地址,如果忘记或者不会初始化也没啥,后面通过赋值的形式也可以解决, Top_Mode.seat[i]=malloc(sizeof(seat_s));(虽然我不太赞同这种写法,但依然引自纯版)。
#42
八画小子2020-07-03 18:54
如果你坚持自己是对的,没必要理会什么啊。天下的代码又不是只有这两句。有这么多时间费时间、费精力、费心情的,不如睡一会。程序猿不缺钱,只缺时间。也可以和女生(或男生)约约,抒发一下感情。生活嘛,不是用来吵架的。
#43
lin51616782020-07-03 18:55
以下是引用八画小子在2020-7-3 18:54:00的发言:

如果你坚持自己是对的,没必要理会什么啊。天下的代码又不是只有这两句。有这么多时间费时间、费精力、费心情的,不如睡一会。程序猿不缺钱,只缺时间。也可以和女生(或男生)约约,抒发一下感情。生活嘛,不是用来吵架的。

不 很好玩
打脸是一件令我愉快的事情
#44
lin51616782020-07-03 19:04
以下是引用ditg在2020-7-3 18:50:23的发言:

你:“指针没初始化 就是野指针了”、“没初始化 没赋值的指针 叫做野指针”
        “我从来没说过 p是野指针”(引自int* p;)

我:“定义了一个指针变量,但是没有赋初值,是否就叫野指针?” - 如果,当然是如果概念可以类推的话,那么int c;应该叫野整型,等等
       “哦,以前没使用过野指针这个词,估计以后也不大会使用了,呵呵” - 刚分配完一个内存空间,我不会叫它野指针,今天不会,以后还是不会,我还是只会叫它一个指针变量,这个指针变量可能没有初始化,内容为一个随机地址,如果忘记或者不会初始化也没啥,后面通过赋值的形式也可以解决, Top_Mode.seat=malloc(sizeof(seat_s));(虽然我不太赞同这种写法,但依然引自纯版)。

我从来没说过 p是野指针 所以是错的
我从来没说过 p是野指针

嗯 如果你认为这两句话表达相同意思 请允许我大笑三声 以示鄙视
定义了一个指针变量,但是没有赋初值,是否就叫野指针?

是的
如果,当然是如果概念可以类推的话,那么int c;应该叫野整型,等等

你喜欢的话 你完全可以这样做 和你交流的人不能看懂的话 那就是你表达能力的问题了
刚分配完一个内存空间,我不会叫它野指针,今天不会,以后还是不会

你会不会叫他野指针 是你个人审美问题 你随意
但这和我描述的准确性和正确性无关
你看不懂是代码阅历问题
野指针这个词遍布整个中文互联网
wild pointer这个词遍布整个互联网世界
全世界都把 没有初始化,内容为一个随机地址 的指针叫做野指针(wild pointer)
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

后面通过赋值的形式也可以解决
我好像没说不行? 然后呢?






[此贴子已经被作者于2020-7-3 19:06编辑过]

#45
八画小子2020-07-03 19:12
回复 44楼 lin5161678
我开始对你顶礼膜拜了😀😀😀😀😀
#46
ditg2020-07-03 19:25

The standard does not define or use the term "wild". I'd be careful "correcting" other people's opinions about what it means, and I'd especially avoid quoting random non-normative internet junk to support my position.

To me, it would mean a pointer that neither refers to a legitimate object, nor is NULL. Possible sources of these types of pointer values might include uninitialized pointer objects, objects that have ceased to exist, computed pointer values, improperly aligned pointer values, accidental corruption of the pointer itself, or what it pointed to, etc.

int main(void)
{

   int *p;  // uninitialized and non-static;  value undefined
   {
      int i1;
      p = &i1;  // valid
   }            // i1 no longer exists;  p now invalid   

   p = (int*)0xABCDEF01;  // very likely not the address of a real object

   {
      int i2;  
      p = (int*)(((char*)&i2) + 1);  // p very likely to not be aligned for int access
   }

   {
      char *oops = (char*)&p;  
      oops[0] = 'f';  oops[1] = 35;  // p was clobbered
   }
}  
#47
lin51616782020-07-03 19:36
以下是引用ditg在2020-7-3 19:25:57的发言:


The standard does not define or use the term "wild". I'd be careful "correcting" other people's opinions about what it means, and I'd especially avoid quoting random non-normative internet junk to support my position.

To me, it would mean a pointer that neither refers to a legitimate object, nor is NULL. Possible sources of these types of pointer values might include uninitialized pointer objects, objects that have ceased to exist, computed pointer values, improperly aligned pointer values, accidental corruption of the pointer itself, or what it pointed to, etc.

int main(void)
{

   int *p;  // uninitialized and non-static;  value undefined
   {
      int i1;
      p = &i1;  // valid
   }            // i1 no longer exists;  p now invalid   

   p = (int*)0xABCDEF01;  // very likely not the address of a real object

   {
      int i2;  
      p = (int*)(((char*)&i2) + 1);  // p very likely to not be aligned for int access
   }

   {
      char *oops = (char*)&p;  
      oops[0] = 'f';  oops[1] = 35;  // p was clobbered
   }
}  

还是那句话 你不喜欢是你的审美问题
这个世界有的是人喜欢这样用
并且 这个词足够准确的描述所表达的意思
至于标准没有使用那就没有使用呗
标准没有定义使用的词多了去了
标准还没定义使用变量这个词呢 是不是也不能说指针变量了?
#48
ditg2020-07-03 19:38

以百度百科为标准,你是对的,应该承认是我水平低
#49
lin51616782020-07-03 19:40
以下是引用ditg在2020-7-3 19:38:08的发言:


以百度百科为标准,你是对的,应该承认是我水平低

搞清楚 指针变量这样的词 按照你的逻辑 也是百度百科水平的词
#50
ditg2020-07-03 19:41

好吧,此生坛里本人禁言,说到做到
#51
lin51616782020-07-03 19:42
以下是引用ditg在2020-7-3 19:41:34的发言:


好吧,此生坛里本人禁言,说到做到

你加油
12