char a[4] = "12345"; //为什么报错

My_Love 2014-04-16 09:13:39
我发现:
char a[4] = "12345"; //报错
char a[6] = "12345"; //不报错
char a[5] = "12345"; //也不报错


这个是怎么回事,难道sizeof("12345")是6吗?
...全文
1349 43 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
FuckBrent 2014-04-19
  • 打赏
  • 举报
回复
请自行百度字符串和字符串数组的区别
自信男孩 2014-04-19
  • 打赏
  • 举报
回复
原因是越界了,所以报错还是正常的。
Morrisss_ 2014-04-18
  • 打赏
  • 举报
回复
引用 39 楼 luoxuechengbing 的回复:
[quote=引用 36 楼 oYinGui1 的回复:] [quote=引用 10 楼 luoxuechengbing 的回复:] 其实,我就想知道 ....char [5]={"12345"}; 不会出错? 必须出错啊
不会出错,列表初始化去初始化数组,如果列表内元素超过数组长,它会取前面的刚好够数组长的数目的元素来初始化的。[/quote] 我用VS2010记得会出错的,你用VS2010试试;; 不知道你用的哪个 嘿嘿。[/quote] 确实。。记错了,记成char p[5] = { '1', '2', '3', '4', '5' };这种了。。
  • 打赏
  • 举报
回复
引用 36 楼 oYinGui1 的回复:
[quote=引用 10 楼 luoxuechengbing 的回复:] 其实,我就想知道 ....char [5]={"12345"}; 不会出错? 必须出错啊
不会出错,列表初始化去初始化数组,如果列表内元素超过数组长,它会取前面的刚好够数组长的数目的元素来初始化的。[/quote] 我用VS2010记得会出错的,你用VS2010试试;; 不知道你用的哪个 嘿嘿。
猴头 2014-04-18
  • 打赏
  • 举报
回复
奥特之星 2014-04-17
  • 打赏
  • 举报
回复
是少了{},应加入。
「已注销」 2014-04-17
  • 打赏
  • 举报
回复
#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;
}
「已注销」 2014-04-17
  • 打赏
  • 举报
回复
"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;
}
mujiok2003 2014-04-17
  • 打赏
  • 举报
回复 1
为什么要报错
mujiok2003 2014-04-17
  • 打赏
  • 举报
回复
引用 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)
dophiJing 2014-04-17
  • 打赏
  • 举报
回复
引用 14 楼 panda1993 的回复:
的确是6,'\0‘作为结束符由编译器自动填入,char a[5]="12345",虽然没有错,但是却不能与null-terminated 的字符串混用,否则会有意想不到的错误
楼上正解,若使用strlen获取字符串长度,则返回的是字符串实际值,是5,sizeof返回的是该变量内存实际占用空间大小
「已注销」 2014-04-17
  • 打赏
  • 举报
回复
引用 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] 不不,我的重点是:不能把字符数组当作字符串来输出
Morrisss_ 2014-04-17
  • 打赏
  • 举报
回复
引用 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 *啊!
Morrisss_ 2014-04-17
  • 打赏
  • 举报
回复
引用 10 楼 luoxuechengbing 的回复:
其实,我就想知道 ....char [5]={"12345"}; 不会出错? 必须出错啊
不会出错,列表初始化去初始化数组,如果列表内元素超过数组长,它会取前面的刚好够数组长的数目的元素来初始化的。
panda1993 2014-04-16
  • 打赏
  • 举报
回复
的确是6,'\0‘作为结束符由编译器自动填入,char a[5]="12345",虽然没有错,但是却不能与null-terminated 的字符串混用,否则会有意想不到的错误
-LanPei- 2014-04-16
  • 打赏
  • 举报
回复
"12345"的真实存储是12345\0 所以sizeof("12345")是6. 看下这篇文章你就明白了。 http://www.ilanever.com/article/sitedetail.html?id=232
loong0306 2014-04-16
  • 打赏
  • 举报
回复
后面会有一个\0哒~亲~
赵4老师 2014-04-16
  • 打赏
  • 举报
回复
犯罪必然被抓吗?
  • 打赏
  • 举报
回复
其实,我就想知道 ....char [5]={"12345"}; 不会出错? 必须出错啊
  • 打赏
  • 举报
回复
引用 4 楼 liuhengxiao 的回复:
你写的是字符串啊,字符串尾部会填充\0的,它也要占一个字节啊!
引用 5 楼 yiyefangzhou24 的回复:
a 这个数组里其实是1,2,3,4,5,\0
引用 3 楼 ffsdp 的回复:
原来真是6。。
引用 6 楼 angel_su 的回复:
c警告,c++报错...
你们在看看题目。。。。。。请在看看题目。
加载更多回复(23)

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧