从 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;
}
我刚开始接触 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;
}