鱼C论坛

 找回密码
 立即注册
查看: 3122|回复: 11

关于不指定数组大小的初始化

[复制链接]
发表于 2018-4-26 09:55:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char str[]="123\0";
  6.     cout<<sizeof str<<endl;

  7.     return 0;
  8. }
复制代码

为什么这样会分配5个字节的空间给str呢?不应该是4个字节吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-26 10:48:24 | 显示全部楼层
可能把你输入的'\0' 也算进去了吧, 然后再自动帮你添加了一个'\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 12:22:43 From FishC Mobile | 显示全部楼层
\   一个字节, 0  一个字节。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 12:46:57 | 显示全部楼层
因为C++里面的字符串跟C里面的字符串是不一样的,C++的字符串更智能和安全一些,会自动在末尾添加\0。不过C++里面也可以使用C风格的字符串,下面str_1是C++风格字符串,str _2是C风格字符串:
  1.     char str_1[] = "123\0";
  2.     char str_2[] = {'1', '2', '3', '\0'};
  3.     cout << "str_1: " << str_1 << " len: " << sizeof( str_1 ) << endl;
  4.     cout << "str_2: " << str_1 << " len: " << sizeof( str_2 ) << endl;
复制代码


运行结果:

str_1: 123 len: 5
str_2: 123 len: 4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 12:50:04 | 显示全部楼层
str_1相当于{'1', '2', '3', '\0', '\0'}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 12:54:57 | 显示全部楼层
BFSDT 发表于 2018-4-26 12:46
因为C++里面的字符串跟C里面的字符串是不一样的,C++的字符串更智能和安全一些,会自动在末尾添加\0。不过C ...

c语言里面的char ch[]="123"不也是会自动添加\0吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 12:56:32 | 显示全部楼层
BFSDT 发表于 2018-4-26 12:50
str_1相当于{'1', '2', '3', '\0', '\0'}

书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 13:26:01 | 显示全部楼层
御笔剑客 发表于 2018-4-26 12:54
c语言里面的char ch[]="123"不也是会自动添加\0吗?

c语言本身是没有string的,一切都要靠程序员自己实现,必须手动在末尾添加‘\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 13:35:12 | 显示全部楼层
御笔剑客 发表于 2018-4-26 12:56
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?

会自动补的
  1.     char str_1[] = "123\0";
  2.     int i = 0;
  3.     for (auto s : str_1){
  4.         ++i;
  5.         cout << "char" << i << ": " << s << " ASCII: " << int(s) << endl;
  6.     }
复制代码

结果如下:
char1: 1 ASCII: 49
char2: 2 ASCII: 50
char3: 3 ASCII: 51
char4:   ASCII: 0
char5:   ASCII: 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 14:26:44 | 显示全部楼层
御笔剑客 发表于 2018-4-26 12:56
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?

只有类型为string的时候才会进行相关的处理
  1.     string ss = "123\0";
  2.     for (char s : ss){
  3.         ++i;
  4.         cout << "char" << i << ": " << s << " ASCII: " << int(s) << endl;
  5.     }
复制代码


结果:
char1: 1 ASCII: 49
char2: 2 ASCII: 50
char3: 3 ASCII: 51

Process finished with exit code 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 17:22:59 | 显示全部楼层
御笔剑客 发表于 2018-4-26 12:56
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?

哪本书上写的?我去看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 17:23:30 | 显示全部楼层
BFSDT 发表于 2018-4-26 14:26
只有类型为string的时候才会进行相关的处理

c primer plus 那本书上写只要双引号括起来,编译器都会自动加上\0来着,如果手动加上,那就不会自动补了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表