御笔剑客 发表于 2018-4-26 09:55:15

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

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

    return 0;
}

为什么这样会分配5个字节的空间给str呢?不应该是4个字节吗?

风过无痕丶 发表于 2018-4-26 10:48:24

可能把你输入的'\0' 也算进去了吧, 然后再自动帮你添加了一个'\0'

Dr丶温 发表于 2018-4-26 12:22:43

\   一个字节, 0一个字节。。。

BFSDT 发表于 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

BFSDT 发表于 2018-4-26 12:50:04

str_1相当于{'1', '2', '3', '\0', '\0'}

御笔剑客 发表于 2018-4-26 12:54:57

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

c语言里面的char ch[]="123"不也是会自动添加\0吗?

御笔剑客 发表于 2018-4-26 12:56:32

BFSDT 发表于 2018-4-26 12:50
str_1相当于{'1', '2', '3', '\0', '\0'}

书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?

BFSDT 发表于 2018-4-26 13:26:01

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

c语言本身是没有string的,一切都要靠程序员自己实现,必须手动在末尾添加‘\0'

BFSDT 发表于 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

BFSDT 发表于 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

人造人 发表于 2018-4-26 17:22:59

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

哪本书上写的?我去看看

御笔剑客 发表于 2018-4-26 17:23:30

BFSDT 发表于 2018-4-26 14:26
只有类型为string的时候才会进行相关的处理




c primer plus 那本书上写只要双引号括起来,编译器都会自动加上\0来着,如果手动加上,那就不会自动补了
页: [1]
查看完整版本: 关于不指定数组大小的初始化