在c中初始化字符串数组的不同方法

different ways to initialize array of strings in c

我正在尝试以不同的方式在 c 中初始化一个字符串数组,但我很难理解它的行为方式。

我正在尝试初始化数组并打印它 ,我试过三种初始化数组的方法

char **argv = {"foo","boo"};
char *argv[] = {"foo","boo"};
char ****argv[] = {"foo","boo"};

然后使用

打印它们
    printf("%s",argv[1]);

我预计第一个和第二个 运行 而第三个失败但第一个给我 运行 时间错误而另一个 运行 没有任何问题 为什么?以及 c 如何编译它们

在这些声明中

char **argv = {"foo","boo"};
char *argv[] = {"foo","boo"};
char ****argv[] = {"foo","boo"};

只有第二个声明有效。

第一个声明无效,因为您不能在包含多个表达式的大括号中使用列表来初始化标量对象。即使您在第一个声明中仅在大括号中使用一个字符串文字,声明变量的类型 ( char ** ) 和初始化程序 ( char * ) 的类型也不同,并且没有隐式类型之间的转换。

第三个声明无效,因为类型 char *(用作初始值设定项的字符串文字的类型)和类型 char ****.

之间没有隐式转换

使用提供的初始化列表的字符数组在 C 中的有效声明可以是

char *argv1[] = {"foo","boo"};  
char argv2[][3] = {"foo","boo"};    
char argv3[][4] = {"foo","boo"};    

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    char *argv1[] = {"foo","boo"};  
    char argv2[][3] = {"foo","boo"};    
    char argv3[][4] = {"foo","boo"};    


    printf( "%s, %s\n", argv1[0], argv1[1] );
    printf( "%3.3s, %3.3s\n", argv2[0], argv1[1] );
    printf( "%s, %s\n", argv3[0], argv3[1] );

    return 0;
}

它的输出是

foo, boo
foo, boo
foo, boo

为了使第一次初始化正确,你可以这样写

char * p[] = {"foo","boo"}
char **argv = p;

另一种方法是使用像

这样的复合文字
char **argv= ( char *[] ){"foo","boo"};

这里还有一个示范程序

#include <stdio.h>

int main(void) 
{
    char **argv= ( char *[] ){"foo","boo"}; 


    printf( "%s, %s\n", argv[0], argv[1] );

    return 0;
}

它的输出是

foo, boo