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。


    推荐阅读