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