【发布时间】:2018-08-10 11:59:08
【问题描述】:
为什么argv[0] 不打印文件名的第一个字符而不是整个文件名字符串?
如果argv 是一个指向字符数组的指针,那么不应该用[n] 访问它,结果是一个字符?如果它是一个字符串(如printf(argv[n] 建议的那样),那么为什么argv[0][0] 不给我文件名的第一个字符(编译但启动时崩溃)?
int main(int argc, char **argv){
printf(argv[0][0]);
while (1){}
return 0;
}
【问题讨论】:
-
因为
argv是一个指向char数组的指针指针。 -
char **可以通过两个索引运算符访问,例如二维数组 (argv[0][0]),但二维数组是数组数组,而不是指针数组。您可以在 SO 上找到几个已在此处解决此问题的问题。 -
@LukaKostic 编译器不在乎。这就是存在未定义行为的原因。您也为此与自己签订了合同。符号
char *argv[]只是为了向读者表明预期的参数确实是一个指针数组,但最终它还是被解释为char **argv,编译器真的不在乎。 -
@LukaKostic 这里有一个很好的教训:代码胜于雄辩。编码都是关于细节的,写出来的描述会遗漏。在这种情况下,您在概念上是正确的
argv[0][0]是文件名的第一个字符。问题是您没有正确打印该字符。总是发布代码。 -
@LukaKostic
argv[0][0]本身不会崩溃。这就是您使用它的方式,这就是代码如此重要的原因。
标签: c