gpt4 book ai didi

c - 双端队列,通过引用调用(创建 header )

转载 作者:行者123 更新时间:2023-11-30 16:17:57 25 4
gpt4 key购买 nike

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

我有这个功能:

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

我的主要调用:

createHeader(&header);
if (header == NULL)
exit(-1);

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

问候

亚历克斯

最佳答案

将函数更改为:

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 函数经常在失败时返回正错误号,在成功时返回零。

关于c - 双端队列,通过引用调用(创建 header ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56102803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com