c - 定义字符串数组

标签 c arrays string

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

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

但是,指向指针的指针可以与动态内存分配(malloccalloc 等)一起使用以指向字符串数组。


char string[] = "John";

在这种情况下,您有一个 char 数组,字符串文字被复制到其中。该步骤由编译器完成,一般在main启动前的启动代码中。


char * string = "Paul";

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

以上两种说法的区别在于,在char数组的情况下,可以修改string的元素,而在第二种情况下则不能。

关于c - 定义字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143533/

相关文章:

c++ - for 循环上的 EXC_BAD_ACCESS(数组函数指针)

c - 在标点符号之前插入字符串 c

javascript - 如何映射联系人数组以生成包含对象和属性的新数组?

java - 如何多次打印一个数组?

c++ - 将字符串与 sprintf() 函数一起使用时出现问题

java - 返回一个文本字符串作为 struts2 的响应

编译包含 ext2fs.h 的文件

c - 二分查找超出时间限制

c - 反转表的系数

c - 读取C中缓冲区的特定部分