【问题标题】:Initialize pointer to pointer on the stack初始化指向栈指针的指针
【发布时间】:2016-11-09 04:58:13
【问题描述】:

我是一个 C 新手,我正在尝试正确地做指针/内存的事情......

在我的例子中,我使用的是 strtol,我需要传递一个 **char 来保存多个返回值之一,但是分配堆空间是多余的。我能找到的最干净正确(我希望)的方法是:

char *_ = NULL;
char **endptr = &_;
ret = strtol("not a number", endptr, 0);

我很好奇,有没有更简洁或惯用的方法来获得这种效果?我觉得命名我永远不会使用的东西很脏......

编辑: 澄清一下,我确实打算使用 endptr,而不是 _

【问题讨论】:

  • _ 是许多人认为变量名称的可疑选择。
  • 很公平。在许多函数式语言中,这是对您不会使用的值进行模式匹配的传统方式。这类事情有 C 约定吗?
  • char *endptr;strtol(str, &endptr, 0);。换句话说,将endptr声明为一个指针,然后将该指针的地址传递给strtol
  • 编辑没有意义。 endptr 除了指向 _ 之外,对其他任何事情都没有好处。但是您可以直接访问_。如果你不使用_,你可以像其他人指出的那样传递NULL
  • 好的。我猜是挑剔的。我打算使用 endptr 和 _,但我不需要同时为它们两个变量。

标签: c pointers memory stack


【解决方案1】:

strtol 接受 NULL 作为第二个参数。见http://www.cplusplus.com/reference/cstdlib/strtol/

所以你可以这样写代码:

ret = strtol("not a number", NULL, 0);

如果它不接受NULL,你可以避免这样一行代码:

char *unused;
ret = strtol("not a number", &unused, 0);

【讨论】:

  • 那么,尽管没有初始化,*unused 的空间总是在堆栈上,&unused 将是一个有效的堆栈地址?
  • @Shane 不,unused 在堆栈上,*unused 未定义,因为未设置 unusued 的指针。比较:int x; printf("%p", &x); 打印x 的地址,即使x 未初始化。
  • 请注意,如果您想查明0 的结果是由于输入不是数字,还是输入实际上是@987654334,您确实需要使用endptr @
【解决方案2】:

如果你不需要 endptr,你可以传递一个空指针给 strtol。否则我不会担心命名一个你不会使用的变量。虽然我不认为我会像你所说的那样将其命名为 _

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多