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

时间:2019-10-30 16:51:36

标签: c arrays initialization c-strings string-literals

我试图以不同的方式用c初始化字符串数组,但我难以理解它的行为。

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

wait = WebDriverWait(browser, 10)
        wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#reports-list","#no_reports")))

然后使用

打印它们
char **argv = {"foo","boo"};
char *argv[] = {"foo","boo"};
char ****argv[] = {"foo","boo"};

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

1 个答案:

答案 0 :(得分:2)

在这些声明中

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