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

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(也就是不自动补0strlen(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;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值