创建循环链接列表编译器停止工作

标签 c

编译器停止工作,请给我一些解决方案

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
    int data;
    struct node *next;
}node;
node * create()
{
    node *p;
    p=malloc(sizeof(node));
    p->next=NULL;
    return p;
}
void add(node **h,int ele)
{   node *temp;
    temp=(*h);
    node *p=create();
    while(temp->next!=temp)
    temp=temp->next;
    temp->next=p;
    p->next=temp;
    p->data=ele;
    (*h)=temp;

}


void main()
{   int ch,ele;
    node *h;
    h->next=h;

    do
    {   printf("\n1 add 2 delete 3 insert at kth position 4 delete at kth position");
        scanf("%d",&ch);

        if(ch==1)
        {
        scanf("%d",&ele);
        add(&h,ele);
    }
    //if(ch==2)

    }while(ch!=5);

}

最佳答案

就像我在评论中所说的那样,我的猜测是您发生了崩溃,当您运行程序时程序会停止,并且它的构建没有错误。

原因是您使用了本地非静态变量h而没有对其进行初始化。除非初始化,否则所有局部非静态变量都具有不确定值,并且在未初始化的情况下使用这些变量会导致未定义的行为

解决方案非常简单:为节点分配内存(作为普通变量或动态分配)并用它初始化指针 h

大多数编译器实际上能够检测此类问题,但由于它在语法和语义上都是合法的,因此不会发出错误,而是发出警告。如果您没有收到此类警告,那么您需要启用更多警告。

关于创建循环链接列表编译器停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33124767/

相关文章:

c - sh : error while loading shared libraries: libc. so.6: 无法打开共享对象文件: 错误 24

c++ - 如何在不使用 return 的情况下从函数中获取变量的地址(指针)

c - 如何调试 SQLite 源代码?

c - 数组的地址和它的第一个元素的地址是一个回填问题

c - 如何在 c 中为日志获取适当的时间戳?

c - 内存分配性能

objective-c - 如何在swift中传递c函数指针

c++ - 浮点除法缺陷

从另外两个数组创建一个静态分配的数组

c - C中单引号和双引号的区别