【问题标题】:Initialize a SequenceList by using a second rank pointer使用第二个秩指针初始化 SequenceList
【发布时间】:2018-02-25 15:57:57
【问题描述】:

我想通过使用第二个等级指针来初始化序列列表,它指向我为序列列表创建的 STRUCT。我试过了,脚本可以编译成可执行文件,但是不能运行。

我使用 C 和 DEV CPP 5.11 作为 IDE。

我只想使用 *Sqlist 作为我的参数来初始化一个序列列表...

这是序列表。

/* can be compiled ,but fail to execute.*/
#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 10
typedef int ElemType;
typedef struct List{
    ElemType *elem;
    int length;
    int listsize;  
}List,*Sqlist;

int InitList(Sqlist *L){   
    (*L)->elem=(ElemType*)malloc(sizeof(ElemType)*LISTSIZE);
    if (!(*L)->elem)  return -1;
    (*L)->length=0;
    (*L)->listsize=LISTSIZE;
}
int main(){
    Sqlist La;
    InitList(&La);
}

这与我使用第二级指针作为 Initialize 函数的参数创建的链接列表相比令人困惑。

#include <stdlib.h> 
#include <stdio.h>
#include <typeinfo.h>
typedef int ElemType ;
typedef struct LNode{
    ElemType data;
    struct LNode* next; 
}LNode,*LinkList; 

int InitList(LinkList *L) {
    (*L)=(LinkList)malloc(sizeof(struct LNode));
    if (!*L) return -1;
    (*L)->data= 0;
    (*L)->next =NULL;
    printf("successfully initialized.\n");
    return 0;
}

非常感谢您的帮助!

【问题讨论】:

  • 你没看出区别吗?在链表中,您为节点本身分配空间,然后填充它。在您的序列列表中,您分配给(*L)-&gt;elem,尽管*L 尚不存在。
  • (我发现为空列表分配虚拟节点的做法也有问题。链表是没有节点的列表,可以在定义时初始化:List *La = NULL;

标签: c list function pointers memory-management


【解决方案1】:

请注意第二个代码在访问其成员之前如何为列表动态分配空间:

(*L)=(LinkList)malloc(sizeof(struct LNode));
(*L)->data= 0;

现在你去做吧:

Sqlist La;
InitList(&La);

它将执行这个:

int InitList(Sqlist *L) {   
    (*L)->elem=(ElemType*)malloc(sizeof(ElemType)*LISTSIZE);

但是指针没有内存!它指向哪里?没有人确切知道。你取消引用指针,请求它的成员elem,然后繁荣!你刚刚调用了未定义的行为,确定!

代码编译成功,无法运行。

这就是你的程序“无法运行”的方式,因为你有一个逻辑错误,如上所述。

您首先需要为Sqlist 分配内存,就像之前为LinkList 所做的那样,然后访问其成员。


PS:最好将指针初始化为 NULL,如下所示:Sqlist La = NULL;

哦,顺便说一句,与您的问题无关,Do I cast the result of malloc? 不!

【讨论】:

  • 感谢您的帮助:D,我意识到我没有为 L 本身分配空间,所以我添加了 " (*L) =(Sqlist)malloc(sizeof(Sqlist)); “之前在我的序列列表的初始函数中,它起作用了! PS:这是我的第一个stackoverflow问题,当有人注意到我的问题并回答它时,我感到非常兴奋!再次感谢您的帮助!
  • 太棒了@justinRen!好吧,当一个答案有帮助时,我们接受它,我的答案左侧有勾号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2012-11-10
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多