为了账号安全,请及时绑定邮箱和手机立即绑定

关于动态分配的问题,请教下大神;

关于动态分配的问题,请教下大神;

C C++
慕粉1600176492 2016-12-24 12:34:37
//clist是用来建立链表的函数,下面还有代码没有写全;  #include"stdio.h" #define N 5 typedef struct node { int date; struct node *next; }SNODE;  SNODE *clist(int a[])//在主函数中的实参是一个长度为5的一维整形数组;   {                        SNODE *h;   SNODE *p,*q;   int i;   q=(SNODE)malloc(sizeof(SNODE));   h=q;   for(i=0;i<N;i++)          //在这里每次都给p开辟一个空间;    {                      //可否理解为p指向的区域一共开辟了5个这样大小的空间; (这里我知道第二次开辟空间的时候,第一次的空间还是存在的,没有清零也没有覆盖);    p=(SONDE *)malloc(sizeof(SNODE));//而每次开辟的空间都是连续的,而且p指向了这些空间的首地址,也就是第一次开辟的那个空间的地址;    p->date=a[i];                    //可不可以这样理解呢?    q->next=p;                     //malloc函数的定义中所说的开辟连续内存空间是不是就是这个意思呢?    q=p; } q->next=0; return h;  }  //这些代码都是本人在自己看的一本讲c语言书上抄过来的,但是这本书是给初学者看的(本人也是初学者(应该能看出来)),这本书并没有讲的特别透彻;  //所以在这里问一下各位大神给解释下这里该如何解释;谢谢!   //以下的代码省略;
查看完整描述

2 回答

已采纳
?
0puppy0

TA贡献24条经验 获得超7个赞

可供分配的内存为数组占用的内存空间,指针用来指向可供分配的内存的起始位置所,以初始化为数组的起始位置。malloc函数的功能是分配长度为n个字符的存储空间,并返回指向该存储空间的起始位置的指针。它首先检查剩余内存空间有没有n个,如果有,则分配n个字符的内存空间(处理方法:将 初始位置后移n个字节使其指向剩余的可供分配的内存的起始位置,返所分配的内存空房间的初始位置),否则,返回空指针表示分配不成功。

查看完整回答
反对 回复 2016-12-24
  • 慕粉1600176492
    慕粉1600176492
    (空间能够被分配的情况下)就是说p指向了一个开辟的空间,第二次再让p指向一个空间,那么p就指向了这两个空间吗? 为什么不会是替换呢
  • 慕粉1600176492
    慕粉1600176492
    明白了
?
柴门3952844

TA贡献4条经验 获得超2个赞

有个问题,连续几次的malloc,无法保证一定开辟到连续的内存位置,如果可以保证,那就没必要下面这一句了:

q->next=p;

正因为无法保证连续几次开辟出的是连续的内存,所以才必须将每次开辟出来的内存地址保存在链表中

链表节点2个变量,一个是当前节点的数据,一个是指向下一个节点的指针,如果开辟出来的保证是连续的地址那就无需链表而用数组就行了。

查看完整回答
1 反对 回复 2016-12-26
  • 2 回答
  • 1 关注
  • 1402 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信