鱼C论坛

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

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

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

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

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

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

    return 0;
}
为什么这样会分配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风格字符串:
    char str_1[] = "123\0";
    char str_2[] = {'1', '2', '3', '\0'};
    cout << "str_1: " << str_1 << " len: " << sizeof( str_1 ) << endl;
    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了吗?

会自动补的
    char str_1[] = "123\0";
    int i = 0;
    for (auto s : str_1){
        ++i;
        cout << "char" << i << ": " << s << " ASCII: " << int(s) << endl;
    }
结果如下:
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的时候才会进行相关的处理
    string ss = "123\0";
    for (char s : ss){
        ++i;
        cout << "char" << i << ": " << s << " ASCII: " << int(s) << endl;
    }

结果:
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-10-1 21:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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