C 为什么这个代码给出了分段错误

C 为什么这个代码给出了分段错误,c,C,这是dubugging时的错误 程序接收信号SIGSEGV,分段故障。[切换到 推压中的螺纹0x7ffff6ff5700(LWP 17504)]0x000000000040124c (q=0x7ffff6ff4ec0,n=…)在discover.h:27 q->TailCpuNode->next=温度 您不初始化Acq\u内核,因此可以访问未初始化的变量。这是未定义的行为,可能导致崩溃 尝试: 除此之外,你还有内存泄漏。更改为: void Discover(struct List *Ac

这是dubugging时的错误

程序接收信号SIGSEGV,分段故障。[切换到 推压中的螺纹0x7ffff6ff5700(LWP 17504)]0x000000000040124c (q=0x7ffff6ff4ec0,n=…)在discover.h:27
q->TailCpuNode->next=温度


您不初始化
Acq\u内核
,因此可以访问未初始化的变量。这是未定义的行为,可能导致崩溃

尝试:

除此之外,你还有内存泄漏。更改为:

    void Discover(struct List *Acqcores){
     struct CpuNode *temp;
     temp= (CpuNode *)malloc(sizeof(struct CpuNode));
     temp->cpuid=1;
     push(Acqcores,temp);
     free(temp);            // Add this
    }
一般来说,您可以通过以下方式做得更好:

    void Discover(struct List *Acqcores){
     struct CpuNode temp;
     temp.cpuid=1;
     push(Acqcores,&temp);
    }

请参见此处的演示

这些代码行存在问题:

  CpuNode temp;
  temp= malloc(sizeof(CpuNode));
应该是

  CpuNode *temp;
  temp= (CpuNode *)malloc(sizeof(CpuNode));
把指针忘在temp前面了

以下是消除seg故障的代码

  inline static void push(List *q,CpuNode *n)
  {
    CpuNode *temp;                       

    temp= (CpuNode *)malloc(sizeof(CpuNode));
    temp->cpuid=n->cpuid;
    temp->next=NULL;
    if (q->HeadCpuNode==NULL) 
        q->HeadCpuNode=q->TailCpuNode=temp;
    else 
    {
       q->TailCpuNode=temp;  //This line should come first.
       q->TailCpuNode->next=temp;
    }   
}

void Discover(List *Acqcores)
{
    CpuNode *temp;
    temp= malloc(sizeof(CpuNode));
    temp->cpuid=1;
    push(Acqcores,temp);
}

仅根据这条消息,我想说
q
q->TailCpuNode
没有确定的地址。是时候启动调试器并开始向后遍历调用堆栈了。您能给我们提供足够的代码来复制该问题吗?从这里开始:。然后使用调试器缩小问题范围。如果您不了解调试工作的结果,请询问一个特定的问题。对不起,我打错了。我已经改变了这一点,但是我仍然得到了分段错误转换
malloc()
的返回值是一个错误:void指针将自动升级,转换可以掩盖错误。除非您使用的是C89之前的编译器,否则它既不是必需的,也不推荐使用。很抱歉,您的错误。问题是:
q->HeadCpuNode
它访问一个未初始化的成员它在结构初始化后工作,但我不明白,意思是我以前使用未初始化的结构,但我从来没有得到过这个看到这个[我还没有初始化struct,但它仍然是working@jayasimhasai-您的链接不起作用,因此我看不到您的代码。请注意:在函数内声明的未初始化结构是错误的(可能有效,也可能失败)。全局结构(即在函数外声明的)会自动进行零初始化。
  CpuNode *temp;
  temp= (CpuNode *)malloc(sizeof(CpuNode));
  inline static void push(List *q,CpuNode *n)
  {
    CpuNode *temp;                       

    temp= (CpuNode *)malloc(sizeof(CpuNode));
    temp->cpuid=n->cpuid;
    temp->next=NULL;
    if (q->HeadCpuNode==NULL) 
        q->HeadCpuNode=q->TailCpuNode=temp;
    else 
    {
       q->TailCpuNode=temp;  //This line should come first.
       q->TailCpuNode->next=temp;
    }   
}

void Discover(List *Acqcores)
{
    CpuNode *temp;
    temp= malloc(sizeof(CpuNode));
    temp->cpuid=1;
    push(Acqcores,temp);
}