https://blog.csdn.net/magic_world_wow/article/details/80500473
char* s = "0123456789";
sizeof(s); //结果 4 ===》s是指向字符串常量的字符指针
sizeof(*s); //结果 1 ===》*s是第一个字符
strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
strlen(*s); // ===》错误
char s[] = "0123456789";
sizeof(s); //结果 11 ===》s是数组,计算到\0位置,因此是10+1
strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
sizeof(*s); //结果 1 ===》*s是第一个字符
原文链接在这里,有一点要特别注意,就是不管利用
char* s = "0123456789";
还是char s[] = "0123456789";
来创建字符串,其在内存后面都有‘\0’存在!!
而在c++中,像char s[] = "0123456789"
这样的形式,s就被看作一种数据类型了,计算其大小时是算上\0的。即sizeof(s)
中s并不是一个指针,当然,在调用下标时用法基本一样,但也有些许不同,让人很困惑。
用的VS2015
int main() {
char s[] = "0123456789";
cout << sizeof(s) << endl; 大小是11没问题
cout << s[9] << endl;
cout << strlen(s) << "strlen1" << endl; 大小10.没问题
s[10] = '7'; `可以这样做,输出7;`
cout << s[10] << endl;
cout << strlen(s) << "strlen1" << endl;
变成27了,因为没了\0,所以随机?(或者是自动扩展?)
s[11] = '6'; 甚至超出原来范围也是可以的
cout << s[11] << endl;
s[12] = '5';
cout << s[12] << endl; 结果是对的,5
cout << strlen(s) << "strlen1" << endl; 还是27
cout << sizeof(s) << endl; 但大小还是11
char* s2 = "0123456789";
cout << s2[9] << endl;
cout << s2[10] << endl; 也是可以的
s2[10] = '7'; `编译通过,但访问时报错,后面就不看了
cout << s2[10] << endl;
system("pause");
char s[10] = "0123456789"; 直接提示这样无法初始化
char s[11] = "0123456789";正确的方式
cout << sizeof(s3) << endl; 结果是11 ===》s表示在内存中的大小 11×1
cout << strlen(s3) << endl; 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
s3[13] = 2;
cout << s3[13] << endl;居然也可以。。懵逼了。。
char p[] = {'a','b','c','d','e','f','g','h'};
char q[] = {'a','b','c','d,'\0','e','f','g'};
sizeof(p); 结果是8 ===》p表示在内存中的大小 8×1(也就是不自动补0)
strlen(p); 为一个随机值,结果与编译器有关,不同编译器结果一般不同
sizeof(q); 结果是8 ===》p表示在内存中的大小 8×1
strlen(q); 结果为4 ===》存在'\0',遇到'\0'计算停止
return 0;
}
退出时报错
Run-Time Check Failure #2 - Stack around the variable ‘s’ was corrupted.
字符串数组真是很神奇的东西,数组访问越界在vs2015里都没事。。。
反而是指针访问有问题。
int aa[] = { 1,2,3,4 };
cout << aa[3] << endl;
cout << aa[4] << endl; 随机值
aa[5] = 777; 没有任何问题,输出777
cout << aa[5] << endl;
在力扣刷题很容易越界报错,,,但这里为什么呢。。求大神解答啊