Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么可以';我声明并定义一个指向字符数组的字符指针变量吗?_C_Arrays_Pointers_Initialization - Fatal编程技术网

C 为什么可以';我声明并定义一个指向字符数组的字符指针变量吗?

C 为什么可以';我声明并定义一个指向字符数组的字符指针变量吗?,c,arrays,pointers,initialization,C,Arrays,Pointers,Initialization,下面代码中的s2初始化有什么问题 #include <stdio.h> int main() { char *s1 = "foo"; char *s2 = {'f', 'o', 'o', '\0'}; printf("%c\n", s1[1]); printf("%c\n", s2[1]); return 0; } 是的,因为{'f','o','o','\0'}是一个括号括起的初始化器列表。它不能以任何方式用于初始化指针变量。但是,它可以用来初始化char数

下面代码中的
s2
初始化有什么问题

#include <stdio.h>

int main()
{
  char *s1 = "foo";
  char *s2 = {'f', 'o', 'o', '\0'};

  printf("%c\n", s1[1]);
  printf("%c\n", s2[1]);
  return 0;
}

是的,因为
{'f','o','o','\0'}是一个括号括起的初始化器列表。它不能以任何方式用于初始化指针变量。但是,它可以用来初始化
char
数组,如

 char s2[] = {'f', 'o', 'o', '\0'};
因为数组不是指针

对于您的情况,您可以尝试使用替代方法作为解决方法

差不多

  char *s2 = (char []){'f', 'o', 'o', '\0'};

只需添加一些额外的信息,这些信息可能在阅读此答案后出现,比如为什么/如何可以使用字符串文字初始化数组,如

  char s3[] = "Hello";
是可能的,因为如第§6.7.9章初始化中所述

字符类型的数组可以由字符串文字或UTF初始化−8串 文字,可以选择用大括号括起来。字符串文本的连续字节(包括 如果有空间或数组大小未知,则终止空字符)初始化 数组的元素


一个更好的问题是,为什么可以使用字符串文本初始化指针,因为不能使用数组初始值设定项初始化指针并不奇怪:毕竟,数组不是指针

但是,字符串文字是特殊的。C允许您使用它们初始化数组和指针,以便为创建以null结尾的字符串提供方便的语法。这就是为什么第一种语法同时适用于字符数组和字符指针。

{}
初始化
=
左侧的数据。比如说

int a[6] = { 0, 0, 15, 0, 29, 0 };
初始化由6个整数组成的数组,这就是为什么初始化器列表中的每个元素都是整数

在你的例子中

char *s2 = {'f', 'o', 'o', '\0'};
因此,您将尝试使用字符的整数值初始化指向char的指针,而这不是您想要的。要初始化字符数组,可以使用

char s2[] = {'f', 'o', 'o', '\0'};
语法,或

char s2[] = "foo"; /* also allowed in C, as dasblinkenlight noted - the better
                    * question would be why this works and Sourav Ghosh gave
                    * the answer */

我们正在创建一个初始化器列表,然后进行类型转换,所以它会临时创建这个未命名(内部命名)[]吗?并将其地址分配给s2?我的意思是关于你的答案
char*s2=(char[]){'f','o','o','\0'}
@SuvP:component literals是具有自动存储持续时间的左值,该存储持续时间会一直延伸到包含范围的末尾。@SuvP
s2
是一个数组,无法分配。我们只是在这里创建一个自动存储的未命名对象来初始化
s2
的元素。在全局范围内,复合文字将具有静态存储持续时间。
char s2[] = "foo"; /* also allowed in C, as dasblinkenlight noted - the better
                    * question would be why this works and Sourav Ghosh gave
                    * the answer */