c-分配给链表中具有字符数组的节点的内存



好的,这是一个简单的c 中的单链表程序

struct node
{
    int id;
    char name[20];
    int sem;
    struct node *link;
};
typedef struct node* Node;
Node getnode()
{
    Node temp=(Node)(malloc(sizeof(Node)));
    if(temp==NULL)
        printf("n Out of memory");
    return temp;
}
Node ins_pos(Node first)
{
    Node temp=getnode();
    printf("n Enter id ");
    scanf("%d",&temp->id);
    printf("n Enter name ");
    scanf("%s",temp->name);
    printf("n Enter semester ");
    scanf("%d",&temp->sem);
    if(first == NULL)
    {
        temp->link=NULL;
        return temp;
    }
    else
    {
        int pos,i;
        printf("n Enter position: ");
        scanf("%d",&pos);
        if(pos == 1)
        {
            temp->link=first;
            return temp;
        }
        else
        {
            Node prev=NULL,cur=first;
            for(i=1; i<pos; i++)
            {
                 if(cur==NULL)
                    break;
                prev=cur;
                cur=cur->link;

            }
            if(cur==NULL && i < pos)
                printf("n Position invalid");
            else
            {
                prev->link=temp;
                temp->link=cur;
            }
            return first;
        }
    }
}
Node del(Node first)
{
    if(first==NULL)
        printf("n List is Empty ");
    else
    {
        Node temp=first;
        printf("n ID: %d was deleted",temp->id);
        first=first->link;
        free(temp);
    }
    return first;
}
void disply(Node first)
{
    if(first==NULL)
        printf("n List is empty");
    else
    {
        Node cur=first;
        while(cur!=NULL)
        {
            printf("n ID : ");
            printf("%d",cur->id);
            printf("n Name : ");
            printf("%s",cur->name);
            printf("n Semester : ");
            printf("%d",cur->sem);
            printf("nnn");
            cur=cur->link;
        }
    }
}
int main()
{
    Node first=NULL;
    int opt;
    do
    {
            printf("n QUEUE MENUn 1.Insert at position  n 2.delete frontn 3.displayn 4.Exit nn Enter your choice : ");
            scanf("%d",&opt);
            switch(opt)
            {
                case 1 :first = ins_pos(first);
                        break;
                case 2 :first = del(first);
                        break;
                case 3 :disply(first);
                        break;
            }

    }while(opt!=4);

    return 0;
}  

插入新节点时,代码块会在malloc语句处崩溃。我怎么知道?嗯,它在询问"输入ID"之前崩溃了。那么,我做错了什么吗?

这里的另一点是,它只适用于节点中的整数字段,这里的问题可能是字符数组。

在此函数中Node getnode()-

Node temp=(Node)(malloc(sizeof(Node)));

使用上面的malloc,您分配的内存等于结构指针类型的Node的大小,但这是不够的。因此,您会出现分段错误。

与其这样,不如这样写-

Node temp=malloc(sizeof(*temp));        //also there is no need of cast

这将分配等于temp所指向的类型的大小的存储器,即等于结构的大小的大小。这是恰当的。

这里有一些错误。

 malloc( sizeof( struct node ) );

否则分配的内存太少。

是否为malloc定义包含stdlib.h,这将导致此问题(没有定义,默认为int)。

您需要使用Node temp=(Node)(malloc(sizeof(*temp)));

相关内容

  • 没有找到相关文章

最新更新