【问题标题】:pointer to struct in CC中指向结构的指针
【发布时间】:2016-08-25 03:56:02
【问题描述】:

我正在学习 c 中的结构指针,并且我已经编写了这段代码用于学习:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
   int id;
   char *name;
}struct_type_t;

void set_struct(struct_type_t **);

int main(int argc, char *argv[])
{
     struct_type_t *m = NULL;

     set_struct(&m);

     printf("%d\n", m->id);
     //fflush(stdout);
     printf("%s\n", m->name);
     return 0;
 }

 void set_struct(struct_type_t **m)
 {
      struct_type_t t;
      *m = &t;

      (*m)->id = 5;
      (*m)->name = "Pointer To Structure";
 }

函数set_struct的意思是通过将指向结构struct_type *m的指针的地址传递给函数来设置结构成员。

但是在 main 函数的 printf 行中,它不是打印结构的字符串成员name,而是只打印整数成员id

我用过 fflush to,但还是不行。

请帮我更正这段代码并检查有什么问题......

【问题讨论】:

    标签: c string pointers structure c-strings


    【解决方案1】:

    您的*m 是一个指针,等于NULL。所以使用 malloc 有一个指向你的 struct_type_t 的指针,你可以在之后释放它。

    void set_struct(struct_type_t **m)
    {
        *m = (struct_type_t *)malloc(sizeof(struct_type_t));
        (*m)->id = 5;
        (*m)->name = strdup("Pointer To Structure");
        // or: (*m)->name = "Pointer To Structure";
    }
    

    【讨论】:

    • @harianja 这是未定义的行为,因为该对象超出范围
    • @CoffeeandCode 如果超出范围,那么为什么它仍然打印结构的 id 成员?
    • @harianja 未定义 行为。隐藏你的妻子和隐藏你的孩子,因为任何事情都可能发生。
    【解决方案2】:

    您返回指向本地对象的指针。它是在堆栈上创建的。你不应该在函数完成它的工作后使用它,因为它不再存在并且它的内存可能包含其他对象。

    使用malloc在堆上分配一块内存,初始化它并使用它直到你调用free

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多