今天在牛客上做错了一道题,引发了我的思考,又看到CSDN上没有关于这个的详解,或许是我没有找到,于是便自己着手写了一篇,作者仅仅是一名大二学生,如您发现文章有错误,请私聊或者评论我修改,麻烦您了
题目贴图
我们都知道sizeof是返回对象或者一个类型所占用的内存地址,而strlen函数返回一个字符串的实际长度。
于是我在vs2019上面测试了一下:
char abc_1[] = "abcdef"; char abc_2[] = { 'a','b','c','d','e','f' }; cout << strlen(abc_1) << endl; cout << strlen(abc_2) << endl; system("pause"); return 0;输出:
这时候我感到很奇怪,为什么第一个跟第二个的输出不太一样,我查阅了资料,发现strlen函数是从字符串的首元素出发,直到遇见结束,输出的是这之间的元素个数;
又因为abc_1字符串它的后面会默认跟上一个,但是abc_2不会。所以输出第二个的时候,编译器会从abc_2的首元素开始计数,直到遇见一个结束计数,而abc_2中f后面并没有添加结尾符,所以它就会一直往下面寻找,直到遇见一个结束,所以第二个输出会比abc_2的实际长度大一点。
我又在vs上打了一遍
char abc_1[] = "abcdef"; char abc_2[] = { 'a','b','c','d','e','f' }; char abc_3[] = { 'a','b','c','d','e','f','' }; cout << strlen(abc_1) << endl; cout << strlen(abc_2) << endl; cout << strlen(abc_3) << endl; system("pause"); return 0;输出:
我们可以看到第三个输出与第一个相同,即当我们以第二种的方式初始化一个字符串时,不要忘记在末尾加上结尾符
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)