argv是char数组时如何是字符串数组?

时间:2018-08-10 11:59:08

标签: c

为什么argv[0]不打印文件名的第一个字符而不是整个文件名字符串?

如果argv是指向一个字符数组的指针,那么不应该使用带有字符的[n]结果访问它吗?如果它是一个字符串(如printf(argv[n]所示),那么为什么argv[0][0]却没有得到文件名的第一个字符(编译但启动时崩溃)?

int main(int argc, char **argv){

    printf(argv[0][0]);

    while (1){}
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的代码表现出未定义的行为,因为您正在将char传递给需要指针的函数。

要打印单个字符,您可以使用以下选项,

  • fputc(argv[0][0], stdout);
  • putchar(argv[0][0]); // Effectively the same as above
  • printf("%c\n", argv[0][0]);

您可以添加更多printf()个变体。

代码崩溃的原因是,printf(argv[0][0]);是未定义的行为,因为该函数将尝试取消引用指针,但是您传递了单个字符,并且该字符的值将被解释为内存地址。

您确实需要启用编译器警告。

答案 1 :(得分:-2)

我正在使用ubuntu服务器14来执行,并且使用gcc编译器来编译代码,并且argv[n][n]为我工作。看一下这段代码

// C program to illustrate
// command line arguments
#include<stdio.h>

int main(int argc, char* argv[])
{
    int counter;
    printf("Program Name Is: %s",argv[0]);
    if (argc == 1)
        printf("\nNo Extra Command Line Argument Passed Other Than Program Name");
    if (argc >= 2)
    {
        printf("\nChecking double array elements: %c",argv[0][0]);
    }
    return 0;
}

输出:

Program Name Is: ./test
Checking double array elements: .

您使用什么机器进行编译和执行?也许还有其他错误...仔细检查!