C 定义字符串数组

C 定义字符串数组,c,arrays,string,C,Arrays,String,为什么以下是初始化字符串数组的可接受方法: char * strings[] = { "John", "Paul", NULL}; 但这种方式将失败: char ** strings = { "John", "Paul", NULL}; 我的想法是,它的工作原理与执行以下操作相对相同: char string[] = "John"; char * string = "Paul"; 他们都在那里工作。这两者之间有什么区别?char*strings[]是一个指针数组。当您将其初始化为 char

为什么以下是初始化字符串数组的可接受方法:

char * strings[] = { "John", "Paul", NULL};
但这种方式将失败:

char ** strings = { "John", "Paul", NULL};
我的想法是,它的工作原理与执行以下操作相对相同:

char string[] = "John";
char * string = "Paul";

他们都在那里工作。这两者之间有什么区别?

char*strings[]
是一个指针数组。当您将其初始化为

char * strings[] = { "John", "Paul", NULL};
字符串
John
Paul
字符串文本。它们是存在于代码或只读内存中的常量。所做的是将指向字符串literal
John
的指针复制到
strings[0]
中,依此类推。i、 e

strings[0] --> holds a pointer to "John". 
strings[1] --> holds a pointer to "Paul"
请注意,程序不应修改字符串文本。如果你这样做了,那就是未定义的行为


char**strings
的情况下,这是指向指针的指针。它是一个单一的内存位置,不能单独容纳多个指针。因此,您不能按如下方式初始化它

char ** strings = { "John", "Paul", NULL};  // error
但是,指向指针的指针可以与动态内存分配(
malloc
calloc
等)一起使用,以指向字符串数组


在本例中,您有一个字符数组,字符串文本被复制到该数组中。此步骤由编译器完成,通常在主程序启动之前的启动代码中完成


这里有一个指向字符串文本的字符指针


上述两种语句的区别在于,对于char数组,您可以修改
string
的元素,但在第二种情况下,您不能修改。

出现了什么错误?
char string[] = "John";
char * string = "Paul";