普通指针和放大器有什么区别? c语言中的自引用指针

时间:2015-10-09 16:28:41

标签: c malloc dynamic-memory-allocation self-reference

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

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

我的问题是 -

为什么malloc结构很重要 指针变量name?指出一些事情, 而 self_referential 不需要动态分配。

我的意思是两个都是null pointer ...所以为什么?

2 个答案:

答案 0 :(得分:2)

两个指针都需要设置为某些。必须将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个实例。其中四个name成员指向字符串,其中三个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" );

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

这完全取决于你的目标。

答案 1 :(得分:1)

  

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

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

2。这样您就可以在strlenstrcpystrcat等函数中使用它(例外strdup但是这也将分配内存)。否则,原因与上述相同。

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

  

我的意思是两个都是空指针......所以为什么??

但你不应该取消引用null pointer,如果你这样你就会出现分段错误(如果幸运的话)。