user-0 提问: char a[4] = "12345"; //为什么报错

回复:
user: user-1
content: 请自行百度字符串和字符串数组的区别

user: user-2
content: 原因是越界了，所以报错还是正常的。

user: user-3
content: 引用 39 楼 luoxuechengbing 的回复:[quote=引用 36 楼 oYinGui1 的回复:] [quote=引用 10 楼 luoxuechengbing 的回复:]   其实，我就想知道   ....char [5]={"12345"}；   不会出错？ 必须出错啊 不会出错，列表初始化去初始化数组，如果列表内元素超过数组长，它会取前面的刚好够数组长的数目的元素来初始化的。[/quote]  我用VS2010记得会出错的，你用VS2010试试；；   不知道你用的哪个 嘿嘿。[/quote] 确实。。记错了，记成char p[5] = { '1', '2', '3', '4', '5' };这种了。。

user: user-4
content: 引用 36 楼 oYinGui1 的回复:[quote=引用 10 楼 luoxuechengbing 的回复:]   其实，我就想知道   ....char [5]={"12345"}；   不会出错？ 必须出错啊 不会出错，列表初始化去初始化数组，如果列表内元素超过数组长，它会取前面的刚好够数组长的数目的元素来初始化的。[/quote]  我用VS2010记得会出错的，你用VS2010试试；；   不知道你用的哪个 嘿嘿。

user: user-5

user: user-6
content: 是少了{}，应加入。

user: user-7
content: #include <stdio.h> #include <string.h>  int main() {     char a[5]="12345";     char *p="12345";//"12345\0"     //printf("%d\n",sizeof("12345"));//6     //printf("%d\n",sizeof(a));//5    // printf("%d\n",strlen("12345"));//5     printf("%s\n",a); //找不到'\0'     printf("%s",p);     return 0; }

user: user-7
content: "12345"作为字符串的时候自动在后面填充'\0' #include <stdio.h> #include <string.h>  int main() {     char a[5]="12345";     printf("%d\n",sizeof("12345"));//6     printf("%d\n",sizeof(a));//5     printf("%d\n",strlen("12345"));//5     return 0; }

user: user-8
content: 为什么要报错

user: user-8
content: 引用 18 楼 k91191 的回复:#include <stdio.h> #include <string.h> int main() { 	char n[4]="12345"; 	printf ("%d\n",strlen (n)); 	printf ("%d\n",sizeof (n));     printf("Hello World!\n");     return 0; }  为什么我的结果却是 n是一个字符数组，不是一个字符串，不能使用strlen(n)

user: user-9
content: 引用 14 楼 panda1993 的回复:的确是6，'\0‘作为结束符由编译器自动填入，char a[5]="12345",虽然没有错，但是却不能与null-terminated 的字符串混用，否则会有意想不到的错误 楼上正解，若使用strlen获取字符串长度，则返回的是字符串实际值，是5，sizeof返回的是该变量内存实际占用空间大小

user: user-7
content: 引用 37 楼 oYinGui1 的回复:[quote=引用 34 楼 u013163178 的回复:] #include <stdio.h> #include <string.h>  int main() {     char a[5]="12345";     char *p="12345";//"12345\0"     //printf("%d\n",sizeof("12345"));//6     //printf("%d\n",sizeof(a));//5    // printf("%d\n",strlen("12345"));//5     printf("%s\n",a); //找不到'\0'     printf("%s",p);     return 0; }  char *p = "12345";         //这种就不要再写了，"12345"是个字面值啊，你定义一个char *类型来接收它的地址                                           //是不是说可以用p来改变一个字面值呢？应该定义为const char *啊！[/quote] 不不，我的重点是：不能把字符数组当作字符串来输出

user: user-3
content: 引用 34 楼 u013163178 的回复:#include <stdio.h> #include <string.h>  int main() {     char a[5]="12345";     char *p="12345";//"12345\0"     //printf("%d\n",sizeof("12345"));//6     //printf("%d\n",sizeof(a));//5    // printf("%d\n",strlen("12345"));//5     printf("%s\n",a); //找不到'\0'     printf("%s",p);     return 0; }  char *p = "12345";         //这种就不要再写了，"12345"是个字面值啊，你定义一个char *类型来接收它的地址                                           //是不是说可以用p来改变一个字面值呢？应该定义为const char *啊！

user: user-3
content: 引用 10 楼 luoxuechengbing 的回复:  其实，我就想知道   ....char [5]={"12345"}；   不会出错？ 必须出错啊 不会出错，列表初始化去初始化数组，如果列表内元素超过数组长，它会取前面的刚好够数组长的数目的元素来初始化的。

user: user-10
content: 的确是6，'\0‘作为结束符由编译器自动填入，char a[5]="12345",虽然没有错，但是却不能与null-terminated 的字符串混用，否则会有意想不到的错误

user: user-11
content: "12345"的真实存储是12345\0 所以sizeof("12345")是6. 看下这篇文章你就明白了。 http://www.ilanever.com/article/sitedetail.html?id=232

user: user-12
content: 后面会有一个\0哒~亲~

user: user-13
content: 犯罪必然被抓吗？

user: user-4
content: 其实，我就想知道   ....char [5]={"12345"}；   不会出错？ 必须出错啊

user: user-4
content: 引用 4 楼 liuhengxiao 的回复:你写的是字符串啊，字符串尾部会填充\0的，它也要占一个字节啊！ 引用 5 楼 yiyefangzhou24 的回复:a 这个数组里其实是1,2,3,4,5,\0 引用 3 楼 ffsdp 的回复:原来真是6。。 引用 6 楼 angel_su 的回复:c警告，c++报错...  你们在看看题目。。。。。。请在看看题目。