【问题标题】:How to refer to a variable that is inside one structure and this structure is initialized as a pointer in another structure?如何引用一个结构内的变量并且该结构被初始化为另一个结构中的指针?
【发布时间】:2021-08-17 08:26:00
【问题描述】:
typedef struct ClientDet {
    char *name;
    int number; 
} ClientDet;

typedef struct ServerReqs {
    char *authVal;
    int noOfReq;
    ClientDet *client;
} ServerReqs;

根据上面给出的代码,我尝试使用指向struct ServerReqs 的指针在ClientDet 内初始化name。但是当我尝试以下策略时,我会遇到段错误或编译错误。

ServerReqs *svr;
svr->client->name = "ABC"; // Returns a seg fault
ServerReqs *svr;
*svr.client->name = "ABC"; // Results in a compilation error: "client not a member of the structure"

我对这里的指针工作有点困惑。为什么这些不起作用?和

在这种情况下,从ServerReq 结构中引用和初始化ClientDet 结构中的变量的正确方法是什么?

【问题讨论】:

    标签: c pointers structure


    【解决方案1】:

    它只是一个指针,并没有为实际对象分配任何内存。您需要为这两种结构分配内存。

    ServerReqs* svr;
    srv = malloc(sizeof(*srv));
    srv -> client = malloc(sizeof(*srv->client));
    

    然后你可以取消引用它

    svr -> client -> name = "aaa"; 或 (*svr).client->name = "aaaa"

    您必须检查分配是否失败。 (为清楚起见省略)

    【讨论】:

      【解决方案2】:

      首先注意svr->client->name = "ABC"; 与(*svr).client->name = "ABC"; 相同,但*svr.client->name = "ABC"; 不正确,因为. 的优先级高于一元*。

      关于分段错误,您没有初始化指针svr 以指向实际的ServerReqs 对象,分配或定义为全局或本地对象。 svr 未初始化,取消引用它具有未定义的行为。此外,一旦将svr 初始化为ServerReqs s; svr = &s;,您还必须确保svr->client 是指向ClientDet 对象的有效指针,然后再将name 成员设置为指向"ABC" 字符串常量。

      typedef 定义了一个类型,而不是一个实际的对象。

      这是修改后的版本:

          ClientDet myclient = { NULL, -1 };
          ServerReqs myserver = { NULL, 0, &myclient };
          
          ServerReqs *svr = &myserver;
          
          svr->client->name = "ABC"; // sets myclient.name
      

      【讨论】:

        【解决方案3】:
        ServerReqs* svr;
        svr->client->name = "ABC";
        

        是正确的。问题是svr->client->name 是一个指针,但它没有任何内存。表示没有为srv->client->name 分配内存。因此,将结构定义更改为:

        typedef struct ClientDet {
            char name[<Anything enough>];
            int number; 
        } ClientDet;
        

        另外,srv-&gt;client 是否分配了内存? srv 本身是否有任何分配的内存?如果没有,似乎是这样:

        srv = malloc(sizeof(ServerReqs));
        srv->client = malloc(sizeof(ClientDet));
        

        或者如果你想指向堆栈中的一个变量:

        ServerReqs t_srv;
        ClientDet t_cl;
        ServerReqs *srv = &t_srv;
        srv->client = &t_cl;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-11
          • 2013-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          相关资源
          最近更新 更多