【问题标题】:Is there a better way to fetch this value from "char **"?有没有更好的方法从“char **”中获取这个值?
【发布时间】:2021-07-05 18:47:24
【问题描述】:

我学习 C 是为了开始做一些有趣的低级代码,但我偶然发现了一个我无法理解的场景,我确定这是因为我不会有很多经验。

目前我的代码非常简单:它接受一些参数,并将第一个参数传递给main,并将其存储为路径字符串。想到的第一个问题是将main参数存储为char *args[]char **args是否正确,我决定使用char **args,因为根据this question可能会有一些情况第一个无法访问的地方,我只想制作一个尽可能完整的代码,并了解该过程的原因。

代码如下:

int main(int argc, char **args) {
    if (args[1] == NULL) return 1;

    // Get path of input file
    char *path = &*args[1];

    fputs(path, stdout);

    return 0;
}

鉴于上面的代码,获取存储在 *args[1] 中的值的更好方法是什么? 看起来很神秘,我花了一段时间才明白也是。

我的理解是char **args,是一个指针,指向一个指针数组。因此,如果我要存储一个字符串或任何其他值以供以后在args 的索引之一中使用,我将不得不分配一个指向内存位置(*path)的新指针,并分配它的给定索引 (&*args[i])。我是不是把事情复杂化了?或者这个思维过程是否正确?

【问题讨论】:

  • char* path = args[1]; 不工作吗?
  • 除非argc > 1 这是未定义的行为。访问前检查。

标签: c pointers command-line-arguments implicit-conversion c-strings


【解决方案1】:

你可以简单地写:

char *path = args[1];

&* 运算符是互逆的,所以 &**& 可以简单地从表达式中删除。

【讨论】:

    【解决方案2】:

    首先是这两个函数声明

    int main(int argc, char **args)
    

    int main(int argc, char *args[])
    

    是完全等价的,因为编译器将具有数组类型的参数调整为指向数组元素类型的指针。

    在这个声明的初始化表达式中

    char *path = &*args[1];
    

    依次应用两个运算符&* 是多余的。所以你可以写

    char *path = args[1]; 
    

    一般也可以代替if语句中的条件

    if ( args[1] == NULL) return 1;
    

    写起来会更安全

    if ( argc < 2 ) return 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多