从 argv 初始化指针以比较地址

Initializing pointer from argv to compare addresses

我刚开始接触 C,阅读了很多关于指针和数组的内容,但似乎无法理解为什么我的代码不能 运行 正确。

我尝试使用 argv 第一个元素的地址调节 while 循环但没有成功。我确信我以错误的方式使用 argv 。

代码如下:

int main(int k, const char* argv[]) 
{   const char** first = NULL ;
    first = &argv[0] ;
    argv += k ;
    while (argv > first) puts(*argv), argv-- ; 
    return 0 ; } 

Returns 分段错误。

这就是我脑子里在做的事情:

先创建一个指针,赋值给NULL(因为argv类型用了两个*)

将此指针赋给argv第一个元素的地址,argv[0]使其显而易见。

将 argv 移动 argc (k)

while 循环将 argv 地址与第一个地址进行比较,并在 argv 未到达第一个地址时打印 *argv,然后递减 argv。

上面的代码确实应该 return 命令行上的所有元素,从最后一个开始并忽略第一个(程序名称)。

感谢您的帮助!

问题是 argv[k](在您的代码中修改 argv 之前)被定义为空指针。通过执行 argv += k,您使 argv 指向该空指针,然后将其传递给 puts,导致 未定义的行为puts 尝试使用该空指针。

一种可能的解决方法是,例如argv += (k - 1) 相反。

您的情况下 argv 的大小为 1,这意味着只有 argv[0] 有效 在生成 argv+=k 时你超出了数组边界

与其改变 argv 本身的值,为什么不简单地操作指向 argv(或其中的元素)的指针。当您递增或递减 argv 本身时,您将失去对原始指针的引用。是的,您可以存储一个副本...,但是您麻烦地声明了一个指向 argv 的指针,只需将您的 k(或 argc)偏移量应用于指针,例如

#include <stdio.h>

int main (int argc, char **argv) {

    char **p = argv;                 /* pointer to argv */
    p += argc - 1;                   /* advance to last */

    printf ("\nin order:");          /* output original order */
    for (int i = 1; i < argc; i++)
        printf (" %s", argv[i]);

    printf ("\nreverse :");          /* decrement p outputting in reverse */
    while (p > argv)
        printf (" %s", *p--);

    putchar ('\n');

    return 0;
}

例子Use/Output

$ ./bin/argvptr my dog has fleas

in order: my dog has fleas
reverse : fleas has dog my

我不知道我是否遗漏了什么。如果你只是想以相反的顺序打印参数,为什么不简单地使用这样的东西:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;

    for (i = argc - 1; i > 0; i--) {
        puts(argv[i]);
    }
    return 0;
}