C语言中的普通指针和自引用指针有什么区别



不同的指针分配有什么区别?

 struct node {
   char *name;
   struct node *itself;
 };

我的问题是-

为什么对malloc结构很重要指针变量name ?指出点什么,while self_referential不需要动态分配。

我的意思是两者都是null pointer…那么,为什么? ?

两个指针都需要设置为一些name必须被设置为指向一个字符串字面值,一个char的数组,或者从malloccallocrealloc返回的一块内存。需要将itself设置为struct node的另一个实例。你是否需要使用动态分配取决于你想要做什么。

在单链表中,itself指针将保存另一个struct node实例的地址。你可以把它想象成这样:

+---+---+    +---+---+    +---+---+    +---+---+   
|   |   |--->|   |   |--->|   |   |--->|   |   |---0
+---+---+    +---+---+    +---+---+    +---+---+    
  |            |            |            |             
  |            |            |            |            
  V            V            V            V            
+---+        +---+        +---+        +---+          
|'f'|        |'b'|        |'b'|        |'b'|        
+---+        +---+        +---+        +---+
|'o'|        |'a'|        |'l'|        |'l'|
+---+        +---+        +---+        +---+
|'o'|        |'r'|        |'e'|        |'u'|
+---+        +---+        +---+        +---+
| 0 |        | 0 |        |'t'|        |'r'|
+---+        +---+        +---+        +---+
                          |'c'|        |'g'|
                          +---+        +---+
                          |'h'|        |'a'|
                          +---+        +---+
                          | 0 |        | 0 |
                          +---+        +---+

我们有4个struct node实例。其中4个的name成员指向string对象,3个的itself成员指向struct node的其他实例。

现在,字符串或其他节点实例是否动态分配取决于您的程序。您可以分配一个struct node数组,并让每个元素显式地依次指向下一个元素:

struct node nodes[N] = {{NULL, NULL}}; 
for ( size_t i = 0; i < N-1; i++)
  nodes[i].itself = &node[i+1];

您可以将每个节点设置为指向一个已经存在的char数组或字符串字面值:

char buffer[] = "foo";
node[i].name = buffer;
node[j].name = "blah";

或者,您可以动态地分配所有内容:

/**
 * Adds a name to the head of a list
 */
void pushName( struct node **head, const char *name )
{
  struct node *newNode = malloc( sizeof *newNode );
  if ( newNode )
  {
    newNode->name = malloc( strlen( name ) + 1 );
    if ( newNode->name )
      strcpy( newNode->name, name );
    newNode->itself = *head;
    *head = newNode;
  }
}
...
struct node *list = NULL;
pushName( &list, "blurga" );
pushName( &list, "bletch" );
pushName( &list, "bar" );
pushName( &list, "foo" );

给了我们类似上图的东西。

这完全取决于你想要什么。

为什么malloc结构指针变量名很重要?

1。可以接受输入。如果不分配内存,您将写入无效的位置,导致UB。

2。以便您可以在strlen, strcpy, strcat等函数中使用它(例外是strdup,但这也将分配内存)。否则,原因同上。

并且struct pointer不需要内存分配是不正确的。在创建没有固定大小的数据结构时需要这样做。

我的意思是两者都是空指针…那么,为什么? ?

但是你不应该取消引用null pointer,如果你得到分割错误(如果幸运)。

最新更新