Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Gcc_C99 - Fatal编程技术网

C 用指针初始化常量数组

C 用指针初始化常量数组,c,gcc,c99,C,Gcc,C99,为什么第一行有效,而其余的无效。我以为第一个是第二个的简写 const char*c=“abc”//为什么有效? 常量字符*b={a',b',c','\0'};//无效的 常量int*a={1,2,3,0};//无效的 数组和指针不是一回事 const char *c = "abc"; 使用字符串常量的地址初始化指针。其他地方包含的Sting常量(不在堆栈上,通常是特殊的全局常量区域) 使用给定字符初始化字符数组(使用给定字符串的内容)。这一个将在堆栈上。在第一种情况下,您有一个字符串文本,它

为什么第一行有效,而其余的无效。我以为第一个是第二个的简写

const char*c=“abc”//为什么有效?
常量字符*b={a',b',c','\0'};//无效的
常量int*a={1,2,3,0};//无效的

数组和指针不是一回事

const char *c = "abc";
使用字符串常量的地址初始化指针。其他地方包含的Sting常量(不在堆栈上,通常是特殊的全局常量区域)


使用给定字符初始化字符数组(使用给定字符串的内容)。这一个将在堆栈上。

在第一种情况下,您有一个字符串文本,它是字符的数组,在这个上下文中,它将被转换为指向字符的指针

在接下来的两种情况下,您将尝试使用列表初始化来初始化指针,该指针将尝试将列表的第一个元素转换为生成警告的指针,因为char或int都不是指针,这与以下方法相同:

const char *b = 'a' ;

如果列表中有有效的指针,那么对于第一个元素来说就可以了,但由于初始值设定项多于变量,因此格式可能不正确。

第一行是有效的,因为C标准允许创建常量字符串,因为它们的长度可以在编译时确定

这一点不适用于指针:编译器无法决定是在堆中为数组分配内存(例如,就像普通的int[]),还是在常规内存中,如malloc()

如果将阵列初始化为:

   int a[] = { 1, 2, 3, 0 };

然后它变为有效,因为现在编译器确定您需要堆(临时)内存中的数组,并且在您离开声明数组的代码部分后,它将从内存中释放。

这里真正的区别是
“abc”
char[]
类型的字符串文字,而
{a',b',c',0}
不是。您可以轻松地使用它初始化完全不同的类型,例如:

struct s{
  char c;
  int i, j;
  float f;
} x = {'a', 'b', 'c', 0};
所以当你写
constchar*b={'a','b','c','\0'}{'a'}->'a'
,并尝试用它初始化指针。这可能会失败,也可能不会失败,这取决于编译器和实际值,例如,许多编译器将解释
const char*b={'\0'}b
初始化为空指针,而不是预期的空字符串

如果要初始化指向通过列表初始化创建的数组(或任何其他类型)地址的指针,应显式强制转换:

const char *b = (const char[]){'a', 'b', 'c', 0};
const int *a = (const int[]){'a', 'b', 'c', 0};
struct s *x = &(struct s){'a', 'b', 'c', 0};

我相信这是正确的答案。编辑我的可能等同于复制你的观点。因此,我删除了我的,我投票给这一个。谢谢你提起这件事。
const char *b = (const char[]){'a', 'b', 'c', 0};
const int *a = (const int[]){'a', 'b', 'c', 0};
struct s *x = &(struct s){'a', 'b', 'c', 0};