我刚开始使用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。
上面的代码应该确实返回命令行上的所有元素,从最后一个开始并忽略第一个(程序的名称)。
感谢您的帮助!
答案 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;
}