双端队列,按引用调用(创建标题)

时间:2019-05-12 19:38:24

标签: c list pointers malloc

我的C代码有一个简单的问题....我想通过引用调用来调用变量。

我有这个功能:

node-sass

我的主要电话:

yarn.lock

现在我遇到以下问题:“程序'[6044] My-C-Project.exe'已退出,代码为-1(0xffffffff)”,因此这意味着我的函数createHeader无法正常工作...可以有人请解释这是什么错误?

致谢

亚历克斯

1 个答案:

答案 0 :(得分:0)

将功能更改为:

HEADER *createHeader(void) 
{
    HEADER *yourHeader = malloc(sizeof(HEADER));
    if (yourHeader == NULL)
        printErrorAndExit();
    yourHeader->first = NULL;
    yourHeader->last = NULL;
    yourHeader->length = 0;
    return yourHeader;
}

使用:

Header *header = createHeader();
if (header == NULL)
    exit(-1);

或者,使用指向指针的指针作为参数:

void createHeader(HEADER **yourHeader) 
{
    *yourHeader = malloc(sizeof(HEADER));
    if (*yourHeader == NULL)
        printError();
    (*yourHeader)->first = NULL;
    (*yourHeader)->last = NULL;
    (*yourHeader)->length = 0;
}

使用:

Header *header = NULL;
createHeader(&header);
if (header == NULL)
    exit(EXIT_FAILURE);

这两种技术可以应用于大多数“分配指针”操作-创建链接列表是一种特别常见的变体。请注意,fopen()fclose()与第一个模型匹配;分配器(fopen())接受一些参数来告诉它该怎么做,该函数返回指向可以使用的结构的指针,该指针最终可以使用并传递给fclose()进行释放。

请注意,printErrorAndExit()不能返回。或者,如果需要,则必须修改功能:

HEADER *createHeader(void) 
{
    HEADER *yourHeader = malloc(sizeof(HEADER));
    if (yourHeader == NULL)
        printError();
    else
    {
        yourHeader->first = NULL;
        yourHeader->last = NULL;
        yourHeader->length = 0;
    }
    return yourHeader;
}

此功能最好不打印任何错误消息-通常会限制其可重用性。

HEADER *createHeader(void) 
{
    HEADER *yourHeader = malloc(sizeof(HEADER));
    if (yourHeader != NULL)
    {
        yourHeader->first = NULL;
        yourHeader->last = NULL;
        yourHeader->length = 0;
    }
    return yourHeader;
}

替代设计可能应该返回状态而不是什么,因此您可以直接测试函数结果:

int createHeader(HEADER **yourHeader) 
{
    int rc = 0;
    *yourHeader = malloc(sizeof(HEADER));
    if (*yourHeader == NULL)
        rc = -1;   /* Or perhaps errno */
    else
    {
        (*yourHeader)->first = NULL;
        (*yourHeader)->last = NULL;
        (*yourHeader)->length = 0;
    }
    return rc;
}

使用:

if (createHeader(&header) != 0)
    …report error and bail out…

使用0表示成功,使用非零表示失败是很常见的(许多Unix系统调用都属于此类)。通常,负返回值表示失败,尤其是如果可以将正值用于成功时,请考虑使用open()。但是POSIX pthread函数通常在失败时返回正错误号,在成功时返回零。