c语言字符串问题
万一在某种实现方式下最后不是一个\\0呢?
■网友
【c语言字符串问题】 题主问的好!我想从以下几个方面来回答。
1. “把字符串存到数组里”这个句话的理解
严格来讲,这样的表述不正确。举个例子:
char *p = "abc";
char c = "abc";
看第二个语句,不是把字符串"abc"存到数组里,而是把字符串"abc"的一个拷贝,复制到数组里。
2. 最后的反斜杠0是编译器给加的是加到数组里面吗?
对于字符串"abc"而言,编译器会自动在末尾加上\u0026#39;\\0‘的。那么在将"abc"一个拷贝复制到数组里时,自然也会将这个\u0026#39;\\0\u0026#39;复制到数组里。
3. 但是strlen为什么又不算空字符呢
strlen没有算进空字符是合理的。比如对于字符串"abc",我们关注的是a,b,c这三个字符,很少有场景需要我们去关注最后的\\0。
字符串这一概念在C语言中是比较重要的概念,有兴趣可以关注我,一起讨论。
■网友
“把字符串存到数组里,最后的反斜杠0是编译器给加的是加到数组里面吗”是,实际上是编译器会在所有字符串尾添加0也就是说"233"和\u0026#39;233\\0\u0026#39;是一样的,嗯……其实和0x32333300也是一样的*我上一句有问题,x86的cpu字符串一般是从内存低字节向内存高字节延伸的(取决于flags寄存器的方向标志位df),而x86通常是大端序,也就是内存高字节对应寄存器高字节,所以"233"对应32位0x00333332,也就是(int)3355442所以准确的说是在存到数组之前编译器就已经在字符串尾加null了所以sizeof("233")的值是4,嗯strlen呢这个就是定义了
■网友
胡扯。你试试:char a = {\u0026#39;1\u0026#39;, \u0026#39;1\u0026#39;};printf("%ld %ld\", sizeof(a), strlen(a));输出是多少。sizeof() 输出的是数据在内存的占用总量。strlen() 则是从指针起始位置开始,一直往后找,直到找到一个二进制 0,也就是 \u0026#39;\\0\u0026#39; 字符,才会停止,然后把找的个数返回;如果声明时没有二进制 0,会一直找下去,直到意外碰到某个二进制 0,这个结果是不可预料的。根本不存在什么编译器加 0。
推荐阅读
- 江苏■江苏交控坚持问题导向、瞄准职工需求——找准“病灶”当好“产改先行官”
- 贵州在建骨干水源工程达到465座有效解决工程性区域性缺水问题
- 四川眉山瓦屋山景区就游客投诉、停车难等问题公开道歉
- 杭州已整改城市道路无障碍环境问题12467处
- 互联网怎样解决“家政服务上门速度慢”的问题
- 中东问题|
- 中国网汽车|购车2个多月、仅行驶8000多公里 宝骏730遭遇7处问题
- OC为何跌出语言榜前十
- |沛县深入开展教育领域突出问题专项整改
- 交换机,路由器经常性的死机咋办
