为什么以下是初始化字符串数组的可接受方式:
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
是字符串文字。它们是存在于代码或只读存储器中某处的常量。所做的是将指向字符串文字 John
的指针复制到 strings[0]
中,依此类推。即
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[] = "John";
在这种情况下,您有一个 char 数组,字符串文字被复制到其中。该步骤由编译器完成,一般在main启动前的启动代码中。
char * string = "Paul";
这里有一个指向字符串文字的 char 指针。
以上两种说法的区别在于,在char数组的情况下,可以修改string
的元素,而在第二种情况下则不能。
关于c - 定义字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143533/