2 xuezha009 xuezha009 于 2018.02.07 21:48 提问

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

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

16个回答

bestsort
bestsort   2018.02.07 21:53

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

gaoyin0831
gaoyin0831 这怎么还有人顶呢?明明回答就是错误的。上面2个写法都不对,改成a->next = malloc()这样就对了。
16 天之前 回复
xuezha009
xuezha009 回复人尽其材: 的确是刚学 空指针 我理解 为啥这个链接的初始化都没分配啊http://blog.csdn.net/timsley/article/details/51139996
16 天之前 回复
billyfff
billyfff 回复xuezha009: LZ刚学吗?第一个是错的。第二个第一句是对的,第二句也不对,赋了一个空指针。
16 天之前 回复
xuezha009
xuezha009 那为啥这个链接的初始化都没分配啊http://blog.csdn.net/timsley/article/details/51139996
16 天之前 回复
sharperhuang
sharperhuang   2018.02.08 02:15

首先要说明的是,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);

barry_di
barry_di   2018.02.08 15:54
 #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;
}

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

yxhlfx
yxhlfx   2018.02.07 21:57

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

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

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

xuezha009
xuezha009 回复双林子木: 大佬 能不能加一下我的qq 251525317 我给你发个图片
16 天之前 回复
yxhlfx
yxhlfx 回复xuezha009: 因为你给的那个链接中只实现的是一个链表节点的删除接口,已经分配好的链表直接从接口参数传递进来了,既然是删除那为什么要分配新的内存
16 天之前 回复
xuezha009
xuezha009 回复xuezha009: 那为啥这个链接的初始化都没分配啊http://blog.csdn.net/timsley/article/details/51139996
16 天之前 回复
xuezha009
xuezha009 是链表 node1你没动态分配内存啊 ?
16 天之前 回复
billyfff
billyfff   2018.02.07 22:04

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

billyfff
billyfff 对,除指针外的变量定义,都是在程序自生内存段中直接分配。
13 天之前 回复
xuezha009
xuezha009 指针结构体 能在程序内存分配?
16 天之前 回复
xingtongju
xingtongju   2018.02.07 22:20

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

xuezha009
xuezha009 这两种情况都是什么场景用啊
16 天之前 回复
yiduiguwen
yiduiguwen   2018.02.08 08:46

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

Mr_localhost
Mr_localhost   2018.02.07 22:06

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

Mr_localhost
Mr_localhost   2018.02.07 22:05

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

zho_123456789
zho_123456789   2018.02.07 22:08

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

共16条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!