Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中指向结构的指针_C_String_Pointers_Structure_C Strings - Fatal编程技术网

C中指向结构的指针

C中指向结构的指针,c,string,pointers,structure,c-strings,C,String,Pointers,Structure,C Strings,我正在学习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_ty

我正在学习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";
 }
#包括
#包括
#包括
类型定义结构
{
int-id;
字符*名称;
}结构类型;
空集结构(结构类型**);
int main(int argc,char*argv[])
{
结构类型为空;
设置结构(&m);
printf(“%d\n”,m->id);
//fflush(stdout);
printf(“%s\n”,m->name);
返回0;
}
空集结构(结构类型**m)
{
结构类型;
*m=&t;
(*m)->id=5;
(*m)->name=“指向结构的指针”;
}
函数
set_struct
通过将指向structure
struct_type*m的指针地址传递给函数来设置结构成员

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

我已经习惯了,但仍然不工作


请帮助我更正此代码并检查出了什么问题……

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


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

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


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

您的
*m
是一个指针,等于
NULL
。因此,使用malloc有一个指向您的
struct\u 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";
}

您的
*m
是一个指针,等于
NULL
。因此,使用malloc有一个指向您的
struct\u 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是未定义的行为,因为该对象超出scope@CoffeeandCode如果它超出范围,那么为什么它仍然打印结构的id成员?@harianja Undefined behavior。隐藏你的妻子和孩子,因为任何事情都有可能发生。@harianja,这是一种未定义的行为,因为那个物体不存在scope@CoffeeandCode如果它超出范围,那么为什么它仍然打印结构的id成员?@harianja Undefined behavior。隐藏你的妻子和孩子,因为任何事情都可能发生。