不同的指针分配有什么区别?
struct node {
char *name;
struct node *itself;
};
我的问题是 -
为什么malloc
结构很重要
指针变量name
?指出一些事情,
而 self_referential 不需要动态分配。
我的意思是两个都是null pointer
...所以为什么?
答案 0 :(得分:2)
两个指针都需要设置为某些。必须将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" );
给了我们类似上图的东西。
这完全取决于你的目标。
答案 1 :(得分:1)
为什么malloc结构指针变量名称很重要?
1。您可以在其中输入内容。如果不分配内存,您将写入导致UB的无效位置。
2。这样您就可以在strlen
,strcpy
,strcat
等函数中使用它(例外strdup
但是这也将分配内存)。否则,原因与上述相同。
struct pointer
不需要内存分配,这是不正确的。在创建没有固定大小的数据结构时,您需要这样做。
我的意思是两个都是空指针......所以为什么??
但你不应该取消引用null pointer
,如果你这样你就会出现分段错误(如果幸运的话)。