指针结构体 的小问题 C语言

指针结构体 初始化时一定要 动态申请分配内存吗 比如 图片说明
哪个对呢 真的只要是个指针结构体 就要动态申请吗 有点糊涂了

第二个哦!指针结构体是因为你并没有为这个结构体分配内存,所以需要malloc分配内存,使用完了以后这个内存不用的话还需要free()
比如说链表中删除一个结点

你这种写法是一种链表结构吧?如果链表的话通常操作应该这样:

struct list {
    void *data;
        struct list* next;
};

//init
struct list node1;
struct list node2;
node1->next = node2;
node2->next = NULL;
当然,应用场景下node1,node2都大部分情况是动态申请的

malloc是分配堆栈上的指针,struct a aa,直接在程序内存上分配。

struct list {
void data;
list
next;
};就可以,不需要那么麻烦.详情请看C++primer plus关于声明定义那一块,能简单解决就简单点,不要钻死胡同

struct list {
void data;
list
next;
};就可以,不需要那么麻烦.详情请看C++primer plus关于声明定义那一块,能简单解决就简单点,不要钻死胡同

都没有问题,但是不需要每次都要动态申请内存,在每一次申请之后必须要释放。

都对, 第一个申请的内存在栈内存,第二个申请的在堆内存.
栈内存的申请不需要程序员手动释放,
堆内存中的对象在释放之前,是有效的.使用完后需要手动释放.
这两种写法,有不同的应用场景

栈内存的申请不需要程序员手动释放,
堆内存中的对象在释放之前,是有效的.使用完后需要手动释放.
这两种写法,有不同的应用场景

首先要说明的是,a 是结构名,不能直接引用 ,如 a->next这样的用法是错误的 ,根本通不过编译。
其次,结构名为a,结构内有个int型变量a,不是很好 的风格。
next是一个指向 a结构实例的指针,当然可以是一个空指针(null),从你的定义看 ,其实是个单向链表,参考如下用法:
1.使用结构变量
struct a firstNode, secondNode,thirdNode;

struct a *Header = &firstNode;

firstNode.next = &secondNode;
secondNode.next = &thirdNode;
thirdNode.next = 0;

2.动态分配
struct a firstNode, *secondNode,*thirdNode;
firstNode = (struct a
)malloc(sizeof(struct a));
secondNode = (struct a*)malloc(sizeof(struct a));
thirdNode = (struct a*)malloc(sizeof(struct a));
struct a *Header = firstNode;
firstNode->next = secondNode;
secondNode->next = thirdNode;
thirdNode->next = 0;
注意:动态分配的内存必须自己释放(free());

链表可以这样遍历:

struct a *p = Header;

do {
// 对p的成员进行操作
.......
//取下一个节点
p = p->next;
} while( p);

2.动态分配
struct a firstNode, *secondNode,*thirdNode;
firstNode = (struct a
)malloc(sizeof(struct a));

firstNode前漏了了*号

一个是栈申请,一个是堆申请,用了malloc就一定要free掉

 #include <stdio.h>
#include <stdlib.h>
struct Node
{
    int data;
    struct Node* next;
};

int main()
{
    struct Node *a = (struct Node*)malloc(sizeof(struct Node));
    struct Node *b = (struct Node*)malloc(sizeof(struct Node));
    a->data = 1;
    b->data = 2;
    a->next = b;
    b->next = NULL;

    struct Node c;
    c.data = 3;
    c.next = NULL;
    b->next = &c;
    return 0;
}

就这么两种用法,多看多写就会了

看你怎么定义,如果定义结构体指针,当然就要动态分配一个空间给这个指针,直接定义一个变量的话,是在栈里分配了内存的。但是你给的代码里的next是一个指针,所以如果要用这个成员的话,就需要先给next分配内存才能用next,不然就会出错,

a->next,这写法完全就是错的,连编译都编译不过吧。a在这里只有个结构体定义类型的标识符,不是声明。

struct list {
void data;
list next;
};嗯,就这样就行了

首先建议你变量的名字起规范一些,你这里有好几个a都不知道a到底代码什么了,自己也糊涂了。
其次,结构体在用指针的时候需要先分配结构体内存后在使用。因为struct a *b 这样只是分配了一个指针变量,并没有真正的结构体对象存在哦。
所以必须要先分配空间。