haodayizhia 2022-09-06 22:31 采纳率: 0%
浏览 84

一个空C风格字符串通过指针赋值后,为什么strlen()还是0?

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[])
{
	char cc[] = "";
	cc[0] = 'a';
	cc[1] = 'b';
	cc[2] = '\0';
	cout << strlen(cc) << endl;
	return 0;
}

看大家都说是越界的问题,我试过了不是的,因为下面这种情况越界也是可以strlen()的

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[])
{
	char cc[] = "a";
	cc[1] = 'a';
	cc[2] = 'a';
	cc[3] = '\0';
	cout << strlen(cc) << endl;
	return 0;
}

 

  • 写回答

5条回答 默认 最新

  • _GX_ 2022-09-06 23:06
    关注

    程序数组访问越界了

    不过这似乎是gcc优化的结果,其他编译器(clang, msvc)显示结果都是2
    gcc似乎对char cc[]="";这种初始化,strlen(cc)直接被替换成0,strlen没有被调用。如果换成其他形式,比如char cc[]="1";char cc[2]="";strlen就会被调用,显示2.
    https://godbolt.org/z/dTb84G31c

    评论

报告相同问题?

问题事件

  • 请选择合适的标签 9月7日
  • 修改了问题 9月7日
  • 修改了问题 9月6日
  • 修改了问题 9月6日
  • 展开全部

悬赏问题

  • ¥15 gojs 点击按钮node的position位置进行改变,再次点击回到原来的位置
  • ¥15 计算决策面并仿真附上结果
  • ¥20 halcon 图像拼接
  • ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥100 求ASMedia ASM1184e & ASM1187e 芯片datasheet/规格书
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么