【问题标题】:Best way to pass pointers between functions [closed]在函数之间传递指针的最佳方法[关闭]
【发布时间】:2016-07-06 14:09:43
【问题描述】:

我在玩 C。只是问几个问题,哪个是最佳做法,以及我是否做错了什么。

我做了一个似乎可以工作的程序:

void main()
{
     char *text;
     text = malloc(10 * sizeof(char));
     dosomethingwithtext(text);
     printf("%s\n", text);
}

但是我也看到过这样的版本:(我知道它不会打印任何有意义的东西,因为我没有添加任何字符,但想象一下我有!)

void main()
{
    char *text;
    text = dosomething();
    printf("%s\n", text);
}
char * dosomething()
{
    char *text;
    text = malloc(10 * sizeof(char));
    return text;
}

或者,如果其中任何一个都不是最佳的,那么最好的方法是什么。基本上我在问最常见/最好的方法。

【问题讨论】:

  • 基于某种观点,但我相信您会得到支持两种方式的答案。 IMO,两种方式都有其优势,具体取决于调用的位置。但在这两种情况下,您都必须记住 free() 语句。
  • void main()main 的无效签名和任何函数声明符的弃用语法。
  • @Olaf deprecated syntax for any function declarator,你能扩展一下吗?
  • @xvan:参见标准中的 6.11.6。

标签: c pointers return


【解决方案1】:

选项 1 具有在同一范围内进行分配和解除分配的优点,这(完全基于意见)更易于跟踪和调试。您可以使用返回值来报告某种状态。

选项 2 遵循Creational pattern,这在非托管内存上很容易泄漏。唯一可能的状态报告是空指针。 (可能还不够)。

【讨论】:

  • 大多数重要代码不会free 代码在其已分配的相同范围内。传递分配的内存可能很容易出错。
  • 但是忘记分配内存在任何现代操作系统上都更容易调试。要找到泄漏,您首先需要知道您有泄漏。
  • 1) 请正确寻址 cmets,否则可能看不到它们。说:用 C 语言编程比 PC 级编程更多。而且您的陈述并不像现在这样普遍。对此没有简单的答案,它在很大程度上取决于应用程序。试着用动态分配的内存写一个不平凡的程序,你可能会明白。
【解决方案2】:

a) 在这两种情况下,您都未能释放内存。对 malloc 的调用必须通过对 free 的调用来平衡。

b) sizeof(char)在C中定义为1,所以调用sizeof(char)没有意义

c) 不是void main(),而是int main(void)int main(int argc, char** args) - 您需要提供返回值。

要回答实际问题,两者都可以。可以说,在第二种情况下,管理内存变得更加困难,因为您不能将 free() 放在与 malloc() 相同的函数中 - 您的 dosomething() 返回一个分配的块。然而,程序在一个地方分配而在另一个地方释放是很常见的。

【讨论】:

  • 我相信来自void* 的演员现在已经过时了。
  • C 不需要强制转换。对于 C++,它是必需的。
  • 在 C 上它可能仍然会抛出警告,所以最好避免噪音。
  • 不鼓励将 void * 转换为 C 中的指针。它绝对不是必需的。 C 不是 C++。
  • @xvan,C 编译器永远不应该为此发出警告。演员阵容是一个非常非常糟糕的习惯。好的 C 代码不包含单个转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多