- 主题:请教一个字符串的问题
变量a长度是5,那么根据教材,它只能存储1234,最后一个存储单元应该存储字符串结束标志\0。
但是实际运行,a存储了12345.这是怎么回事呢?printf打印也是打印了12345
#include<stdio.h>
#include<string.h>
int main(void)
{
int num1,num2;
char a[5] = "12345";
printf("%s",a);
num1=strlen(a);
num2=sizeof a;
return 0;
}
--
FROM 112.32.8.*
那您是说,确实应该将a变量数组长度增加一位,以存下12345?
【 在 flw 的大作中提到: 】
: 错误的程序不能保证一定会出错误的结果。
:
--
FROM 39.144.38.*
好,谢谢!
【 在 flw 的大作中提到: 】
: 对,我们只研究如何写正确的程序就可以了。
: 错误不必深究,知道它是个错误就可以了。
:
--
FROM 39.144.38.*
谢谢您的解释,很清楚!
【 在 a9udn9u 的大作中提到: 】
: 太久没碰C了可能说得不对,C的内存安全检查特别松散,你这个应该是正好‘5’后面的那块内存值是0,所以printf打印到‘5’之后遇到0就结束了(strlen也是找0)。但是a并不拥有‘5’后面的0占用的内存单元,所以sizeof返回5,你再申请内存的时候,那个内存单元可能会分配给别的变量并且重新赋值,再打印就不会在‘5’那里结束了。
:
--
FROM 39.144.38.*
对
【 在 floppyking 的大作中提到: 】
: C语言是不是从a[0]开始?
--
FROM 39.144.38.*
现在仍是大学入学后的首门编程语言课,实际用得也不少吧!
【 在 operater 的大作中提到: 】
: “12345”的后面恰好是'\0'
: (我穿越回10年前了吗?现在用c的人不多了。解答的机会不多了。)
:
--
FROM 39.144.38.*
内存是怎么查看的?dev-c能看吗?
【 在 Ksharp 的大作中提到: 】
: 刚才试了一下 在我电脑的编译器上 sizeof是字符数组的长度,不管是大于还是小于5 都可以输出定义的长度值
: 而strlen有的时候输出6了
: 我打印后面内存看了一下,当后面一个值是5 asc对照表是不可显示控制字符 请求ENQ的时候 strlen是可以输出5的, 估计跟strlen的实现有关吧。。
: ...................
--
FROM 39.144.38.*
好,多谢!
【 在 Ksharp 的大作中提到: 】
: for (int k=0;k<7;k++){
: printf("%#x %c\n",a+k,*(a+k));
: }
: ...................
--
FROM 39.144.38.*
结果没有差异,char a[5]= "12345“后面的内存没有用,恰好就是空。所以就和它一样了:char a[] = "12345"
【 在 freynew123 的大作中提到: 】
: 你这个严格意义上来讲是字符数组,而不是字符串
: 你对数组每一个元素都赋值了,怎么会截取呢
: 你说的问题,不是C语言的范畴,而是编译器的行为
你试试看 char a[5]= "12345“
和 char a[] = "12345"
看看两者是否有差异
--
FROM 112.32.8.*
嗯,有些差别,这个说的挺好:
https://blog.csdn.net/m0_68865259/article/details/124346496
【 在 nudtcq 的大作中提到: 】
: 字符数组跟字符串不是一个概念吧?
--
FROM 112.32.8.*