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

时间:2017-11-09 07:07:32

标签: c arrays pointers argv

我刚开始使用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 ; } 

返回分段错误。

这就是我正在做的事情:

首先创建一个指针,将其指定为NULL(因为argv类型使用两个*)

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

按argc(k)移动argv

while循环将argv地址与第一个地址进行比较,只要argv没有到达第一个地址就打印* argv,然后递减argv。

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

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

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

解决这个问题的一种可能方法是而是argv += (k - 1)

答案 1 :(得分:1)

为什么不简单地操纵指向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;
}

示例使用/输出

$ ./bin/argvptr my dog has fleas

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

答案 2 :(得分:0)

您的案例中argv的大小为1,这意味着只有argv [0]有效 生成argv + = k时,超出数组边界

答案 3 :(得分:0)

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

#include <stdio.h>

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

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