我是C的新手,并试图了解为什么此代码只返回当前目录文件列表而不是我传递给的目录。
我使用了c11标准gcc编译器
并且只使用./a.out filedirectory .....
int main(int argc, char *argv[])
{
char*args[3];
if(argc > 1)
{
args[0] = "/bin/ls";
args[1] = "-l";
if(argv[2])
{
args[2] = argv[2];
args[3] = NULL;
}
else
{
args[2] = NULL;
}
execvp(args[0],args);
return 0;
}
}
答案 0 :(得分:2)
您没有告诉自己如何运行程序myprog
。我们假设您将其作为(例如)./myprog /tmp/
运行。
在C programming language(读n1570)数组索引从0开始!
然后输入您的main
argc
是2 argv[0]
是"./myprog"
字符串argv[1]
是"/tmp/"
字符串argv[2]
是NULL
指针(由main
的C规范保证并由crt0实现),因为它是main
函数< / LI>
(在C的所有其他情况下,指针数组不隐式NULL
终止,但main
的{{1}}是特殊的)功能
使用铅笔或使用argv
调试器跟随您的程序源。第一个gdb
成功,但第二个if (argc > 0)
失败。然后,if (argv[2])
设置为args[0]
,"/bin/ls"
设置为args[1]
,"-l"
设置为args[2]
NULL
。
请参阅execvp(3),execve(2)并阅读Advanced Linux Programming
你真的应该养成所有警告的编译习惯。调试信息(execvp
与GCC,例如将gcc -Wall -Wextra -g
源文件编译为yoursource.c
可执行文件myprog
)并了解如何使用调试器{{ 1}} 强>
顺便说一句,您对gcc -Wall -Wextra -g yoursource.c -o myprog
的使用是undefined behavior(越界索引或buffer overflow),因此您应该scared,因为gdb
已声明作为维度3的数组(因此有效索引仅为0,1和2)。在您的情况下,最近的GCC会警告您。