欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sizeof和strlen的区别——终极教程,有这一篇就足够了!

程序员文章站 2022-06-15 13:55:31
...

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;居然也可以。。懵逼了。。


	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;

在力扣刷题很容易越界报错,,,但这里为什么呢。。求大神解答啊

相关标签: C++