0

我有一个 C 项目,我对 C 和 linux 环境很陌生。

我正在使用以下系统信息开发 linux 发行版

Linux bt 3.2.6 #1 SMP Fri Feb 17 10:34:20 EST 2012 x86_64 GNU/Linux

用 gcc 编译后,在上述操作系统上,我得到了等待的结果。

在将我的项目提交给教授之前,我曾想过尝试在另一个 linux 发行版上编译并执行该程序,系统信息如下

Linux feistyFawn 2.6.20-15-generic #2 SMP Sun Apr 15 07:36:31 UTC 2007 i686 GNU/Linux

我在这个下得到了分段错误。来说明输出控制台。这是图像。

作品

在此处输入图像描述

失败

在此处输入图像描述

我不知道现在该怎么办。


代码

调用此函数会导致另一个操作系统出现分段错误。

fileInEvenements(listEvents, 'A', time, queueId);

它所做的是将名为 A 的事件归档到队列结构 listEvents 中。

及其定义

void fileInEvenements(eventStructure *listEvents, char eventType, int time_exec, int id_queue)
{
    Event *newEvent = malloc(sizeof(*newEvent));
    if (newEvent == NULL || listEvents == NULL){
        exit(EXIT_FAILURE);
    }

    newEvent->type = eventType;
    newEvent->execution_time = time_exec;
    newEvent->id = id_queue;
    if (listEvents->firstEvent != NULL)
    {
        // the list contains at least one event, go to the end of list 
        Event *evCurrent =  listEvents->firstEvent;
        while (evCurrent->next != NULL)
        {
            evCurrent = evCurrent->next;
        }
        evCurrent->next = newEvent;
    }
    else // the list contains no event, new event becomes first event
    {
        listEvents->firstEvent = newEvent;
    }

}
4

2 回答 2

3

当您在链接列表中创建新条目时,您试图通过从头部开始并迭代列表直到找到NULLin将其附加到列表中evCurrent->next。当您确实找到 a 时NULL,您停止迭代列表,并在此时newEvent通过分配作为列表中的下一个条目evCurrent->next = newEvent;- 当然,如果链表中没有条目,则将新条目设置为头部通过列表listEvents->firstEvent = newEvent;

但是,您绝不会初始化 的值newEvent->next。请注意,malloc()它不会初始化它返回的内存块。它只是分配一个块并将其返回给您。请参阅此处的文档http://www.cplusplus.com/reference/cstdlib/malloc/

关键是这个...

新分配的内存块的内容初始化,剩余的值不确定。

因此,newEvent->next对于所有实际目的,是一个随机值。因此,您的代码会进入随机内存漫游,因为您指望它NULL终止链表。

我可能会建议你尝试calloc()

Evenement *newEvent = calloc( 1, sizeof(*nvEvent) );

否则,请确保在创建元素时将next元素的值初始化为NULL

于 2013-04-20T19:21:09.990 回答
1

添加一行:

newEvent->next = NULL;

使用未初始化的字段是错误的。

或者,您可以使用以下内容:

newEvent = calloc(sizeof(*newEvent), 1); // instead of malloc

或者

memset(newEvent, 0, sizeof(*newEvent)); // set all fields to 0
于 2013-04-20T19:35:24.140 回答