Why is literal string assignment in C not possible for array with specified length?
Possible Duplicate:
What is the difference between char s[] and char *s in C?
Do these statements about pointers have the same effect?
一直以来,我都认为每当我需要复制一个字符串(无论是文字还是变量)时,我都需要使用
1 | char a[]="test"; |
而这
1 | char *a="test"; |
据我所知,第二种类型是不安全的,在某些情况下会打印垃圾。对吗?更让我好奇的是,为什么以下内容不起作用:
1 2 | char a[5]; a="test"; |
或者这个
1 2 | char a[]; a="test"; |
但这是可行的
1 2 | char *a; a="test"; |
如果有人能把事情弄清楚一点,我会很高兴的。
char a[]="test";
它声明并初始化一个大小为5的数组,其中包含
char *a="test";
这声明并初始化指向文字
char a[5];
a="test";
即使当
char a[];
a="test";
这将声明一个大小未知的数组。申报书在使用前应填写完整。
char *a;
a="test";
这很好,因为
让我们逐个分析:
1 | char a[]="test"; |
这就告诉编译器在堆栈上分配5个字节,将
1 | char *a="test"; |
"test"(如我所说,基本上是
1 2 | char a[5]; a ="test"; |
您要告诉编译器将一个字符串的内容复制到另一个字符串。这不是一个简单的操作。对于
定义
1 2 | char *a; a ="test"; |
您将
如我所说,分配数组(无论是以空结尾的char(string)数组还是任何其他数组)是编译器不为您做的一项重要任务,这就是为什么您要为它提供函数的原因。
不要混淆C中的赋值和初始化,它们是不同的。
在C语言中,字符串不是数据类型,它是一种约定,使用数组和nul终止符。与任何数组一样,当您分配它时,它的名称解析为一个指针。可以指定指针,但这与指定字符串不同。