不同指针指针之间的区别是什么?c语言中普通指针和自指针指针的区别
struct node {
char *name;
struct node *itself;
};
我的问题是 -
为什么它是malloc
结构 指针变量name
重要?指向它, 而self_referential不需要动态分配。
我的意思是两个都是null pointer
......所以呢?
不同指针指针之间的区别是什么?c语言中普通指针和自指针指针的区别
struct node {
char *name;
struct node *itself;
};
我的问题是 -
为什么它是malloc
结构 指针变量name
重要?指向它, 而self_referential不需要动态分配。
我的意思是两个都是null pointer
......所以呢?
为什么malloc结构指针变量名很重要?
1.您可以在其中输入内容。如果不分配内存,您将写入导致UB的无效位置。
2.这样就可以在函数中使用它像strlen
,strcpy
,strcat
(例外是strdup
但也将分配内存)。否则,原因与上述相同。
并非如此内存分配不需要struct pointer
。在创建没有固定大小的数据结构时,您需要这样做。
我的意思是两个都是空指针......所以呢?
但你不应该提领null pointer
,如果你让你得到分段错误(如果幸运的话)。
这两个指针需要设置为。 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");
这让我们像上面的图。
这一切都取决于你要去的。
谢谢...这很有帮助.. –
请将问题置于实际文章中。这就是说,你需要为char char分配(有时),因为它是C风格的字符串,并且通常不应该引用外部字符串。 – owacoder
@owacoder:'char *'既不是**字符串,也不是** _array_! – Olaf
@Olaf - 我知道它既不是一个字符串,也不是一个数组。 (我没有想到我在我的评论中提到了数组,或者我是否?)在这种情况下,它被用于名称,显然是**字符串**。 – owacoder