【问题标题】:what is difference between normal pointer & self referential pointer in c languagec语言中的普通指针和自引用指针有什么区别
【发布时间】:2015-10-09 16:28:40
【问题描述】:

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

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

我的问题是-

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

我的意思是两者都是null pointer...那为什么呢??

【问题讨论】:

  • 请将问题放在实际帖子中。话虽如此,您需要(有时)为 char * 分配,因为它是 C 风格的字符串,并且通常不应该引用外部字符串。
  • @owacoder: char * 既不是字符串,也不是 数组!
  • @Olaf - 我知道它既不是字符串也不是数组。 (我不认为我在评论中提到了数组。或者我有吗?)但是,在这种情况下,它被用于名称,这显然是一个 string。
  • @owacoder:你可能知道,但你忘记了其他人——包括 OP——阅读你的评论不是。在帮助站点上正确是必不可少的。不是,它不是一个字符串(类型),而是一个char array,used 用于store一个 C 字符串。然而它仍然是一个数组!
  • @Olaf - 我明白你的意思。我为混乱道歉。我想我应该说“name 被用作指向一系列共同存储名称的连续字符的指针。”这完全避免了整个数组/指针/字符串术语。 ;)

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


【解决方案1】:

两个指针都需要设置为something。 name 必须设置为指向字符串文字、char 的数组或从malloc 或calloc 或realloc 返回的一块内存。 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" );

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

这完全取决于你的目标。

【讨论】:

    【解决方案2】:

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

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

    2. 这样您就可以在 strlen 、 strcpy 、strcat 等函数中使用它(strdup 除外,但这也会分配内存)。否则,原因同上。

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2021-09-10
      • 2011-04-04
      • 2010-12-17
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多