使用第二个排名指针初始化SequenceList

时间:2017-09-16 17:53:28

标签: c list function pointers memory-management

我想通过使用第二个等级指针来初始化序列列表,该指针指向我为序列列表制作的STRUCT。我试过,脚本可以编译成可执行文件,但无法运行。

我正在使用带有CP CPP 5.11的C作为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;
}

我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

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

(*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?不!