2015-10-09 71 views
-3

不同指针指针之间的区别是什么?c语言中普通指针和自指针指针的区别

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

我的问题是 -

为什么它是malloc结构 指针变量name重要?指向它, 而self_referential不需要动态分配。

我的意思是两个都是null pointer ......所以呢?

+3

请将问题置于实际文章中。这就是说,你需要为char char分配(有时),因为它是C风格的字符串,并且通常不应该引用外部字符串。 – owacoder

+1

@owacoder:'char *'既不是**字符串,也不是** _array_! – Olaf

+0

@Olaf - 我知道它既不是一个字符串,也不是一个数组。 (我没有想到我在我的评论中提到了数组,或者我是否?)在这种情况下,它被用于名称,显然是**字符串**。 – owacoder

回答

1

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

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

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

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

我的意思是两个都是空指针......所以呢?

但你不应该提领null pointer,如果你让你得到分段错误(如果幸运的话)。

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"); 

这让我们像上面的图。

这一切都取决于你要去的。

+0

谢谢...这很有帮助.. –