Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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_Function_Pointers_Struct_Typedef - Fatal编程技术网

c中指向结构的函数

c中指向结构的函数,c,function,pointers,struct,typedef,C,Function,Pointers,Struct,Typedef,我正在分析一段代码,似乎不能完全理解它背后的一些工作原理 struct dplist { dplist_node_t * head; }; struct dplist_node { dplist_node_t * prev, * next; element_t element; }; dplist_t * dpl_create () { dplist_t * list; list = malloc(sizeof(struct dplist)); DPLIST_ERR_

我正在分析一段代码,似乎不能完全理解它背后的一些工作原理

struct dplist {
  dplist_node_t * head;
};

struct dplist_node {
  dplist_node_t * prev, * next;
  element_t element;
};

dplist_t * dpl_create ()
{
  dplist_t * list;
  list = malloc(sizeof(struct dplist));
  DPLIST_ERR_HANDLER(list==NULL,DPLIST_MEMORY_ERROR);
  list->head = NULL;   
  return list;  
}
从头文件:

typedef int element_t;
typedef struct dplist dplist_t;
typedef struct dplist_node dplist_node_t;
在主要功能中:

dplist_t * list = NULL;

int main(void)
{
     list = dpl_create();
     return 0;
}
我不知道如何查看dpl_create()函数,它被声明为dplist结构的指针(我想是吧?)。为什么函数需要声明为指向结构的指针才能正确执行函数中写入的内容?

dpl\u create()分配一个新的dplist\u t并返回它。 在C语言中,不能返回动态分配的对象,必须返回对它们的引用(指针),因此

dplist_t *
dpl_create()分配一个新的dplist_t并返回它。 在C语言中,不能返回动态分配的对象,必须返回对它们的引用(指针),因此

dplist_t *

C中函数声明的第一个元素,在函数名之前,总是它将返回的变量的类型。 在您的例子中,函数没有声明为“指向结构的指针”,它只是声明它将返回指向结构的指针(“返回列表”)。
您可以在代码中看到main函数的另一个示例,它将返回INT(“return 0”)。

在C中函数声明中,函数名之前的第一个元素始终是它将返回的变量的类型。 在您的例子中,函数没有声明为“指向结构的指针”,它只是声明它将返回指向结构的指针(“返回列表”)。
您可以在代码中看到main函数的另一个示例,它将返回一个INT(“返回0”)。

该函数被声明为函数。函数名前面的
dplist\u t*
部分是返回类型。因为它返回指向结构实例(已通过
malloc
动态分配)的指针。函数声明为函数。函数名前面的
dplist\u t*
部分是返回类型。因为它返回指向结构实例的指针(已通过
malloc
动态分配)。当然,谢谢!如果你不介意的话,我还有一个问题要问。在类型定义为dplist_节点的结构dplist_节点中,有一个指向另一个已声明dplist_节点的“next”和“prev”指针。我是否必须将它们视为指向同一个结构的指针,或者这些都是初始结构的单独实例?@ThealPCA02这是一个双链接列表的实现。该列表由节点组成,其中每个节点都持有指向上一个节点和下一个节点的指针。”“next”和“prev”不指向结构,它们指向内存,每个都可能指向从同一结构分配的不同内存。感谢@Arik,我理解这一点,但是“next&prev”指向类型dplist\u node\u的指针定义不支持什么值?它不支持值,您可以将其视为NULL(虽然从技术上讲不是)。要使其指向某个节点,您必须显式地将其分配给某个对象。这是一个函数的示例,该函数在列表中的给定节点之后创建新节点。给定节点必须指向新节点,而新节点必须指向给定节点。在C中,您不能返回动态分配的对象“什么?为什么?您可以如果返回类型为
dplist\t
(如果该列表复制到某个地方,则它将泄漏),则可以执行
return*list
啊,当然谢谢!如果你不介意的话,我还有另一个问题。在类型定义为dplist\u node\t的struct dplist\u节点中,有一个“next”和一个“prev”指针指向另一个声明的dplist\u节点。我必须将它们视为指向同一个结构的指针,还是这些都是初始结构的单独实例?@TheAlPaca02这是一个双链接列表的实现。这样的列表由节点组成,其中每个节点都有一个指向上一个节点和下一个节点的指针。“下一个”和“上一个”不指向结构,它们指向一个内存,每个都可能指向从同一个结构分配的不同内存。谢谢@Arik,我理解这一点,但w类型dplist\u node\u的next&prev指针定义是否成立?它不存在值,您可以将其视为NULL(尽管从技术上讲不是)。要使其指向某个节点,您必须显式地将其分配给某个对象。这是一个函数的示例,该函数在列表中的给定节点之后创建新节点。给定节点必须指向新节点,而新节点必须指向给定节点。在C中,您不能返回动态分配的对象“什么?为什么?您可以如果返回类型为
dplist\t
(如果该列表复制到某个地方,则它将泄漏),则可以执行
return*list