gpt4 book ai didi

c - 为什么这个 C 代码段被标记为错误?

转载 作者:行者123 更新时间:2023-11-30 21:41:42 25 4
gpt4 key购买 nike

我是 c 的新手。我在 C 语言中遇到了这段代码,它被标记为错误代码。不确定为什么不好以及有什么改进建议吗?

原始代码来自此链接:

https://pastebin.com/r2rTN6Zf

typedef struct {
bool is_married;
uint8_t age;
uint8_t num_children;
} personal_info;

int lookup_personal_info(char *first_name, void *last_name, uint8_t (*sin)[9], const struct **info_out)
{
// Sanity check.
if (!first_name || !last_name || !sin)
return false;

char *initials[3] = { first_name[0], last_name[1] };

// Allocate space for the output.
personal_info *data = malloc(sizeof(struct personal_info));
if (!data)
goto fail;

// Look up the personal info by initials.
bool is_ok = database_lookup(initials, &data);
if (is_ok)
goto fail;

// Assign the found data to the output parameter.
*info_out = (personal_info *) data;

// Success!
return true;

fail:
data = NULL;
free(data);

return true;
}

最佳答案

任何像样的linter将标记此代码的许多问题。这是 Atom editor 提供的内容发现的,加上我所看到的。

int lookup_personal_info(char *first_name, void *last_name, uint8_t (*sin)[9], const struct **info_out)
  • last_name 声明为 void * 但用作 char *
  • const struct **info_out 声明一个匿名结构。它应该是 personal_info **info_out
  • 该函数返回 bool,而不是 int
  • sin 从未被使用,除非检查它是否传入。
    if (!first_name || !last_name || !sin)
return false;
  • 传入空指针可能是调用者的错误。这会默默地忽略该错误,使其难以找到。它应该会引发错误。
  • 它忘记检查 info_out
    char *initials[3] = { first_name[0], last_name[1] };
  • 这是一个用 char 初始化的字符指针数组。它应该是char initials[3]
  • 它不是以 null 结尾的。也许不必如此,但我不会冒这个险。
  • last_name 声明为 void *,但用作 char *
  • 它使用 first_name 的第一个字符作为首字母,这是有道理的,但为什么第二个...东西...在 last_name 中?
    personal_info *data = malloc(sizeof(struct personal_info));

struct individual_info 不是类型,类型是 personal_info

    *info_out = (personal_info *) data;

info_out 被错误地声明为匿名结构。它应该是personal_info **info_out。那么就不需要类型转换。

    bool is_ok = database_lookup(initials, &data);
if (is_ok)
goto fail;

支票是倒退的。

使用goto 是合理的,可以确保正确清除错误。它可能作为转移注意力的内容包含在示例中。

fail:
data = NULL;
free(data);

return true;
  • free 在清空泄漏内存的 data 后调用。
  • 无需将 data 设置为 NULL,它对于即将退出的函数来说是本地的。
  • 失败和成功均返回 true

关于c - 为什么这个 C 代码段被标记为错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56672387/

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