用
https://gcc.godbolt.org/的在线编译器跑了一下程序,自己也简单改了一下
感觉这个问题更像是类型转换时截断的情况
字符数组大于5时,编译器保证将 空字符 压栈,等于5时,就将5个字符压栈(mov byte) 小于5时,后面的字符将不会被压栈,例如为4时,栈空间中不会有字符‘5’同时编译器会报warning,程序大都可以正常运行。
部分编译器里面有完整的字符串(.LC0 含空字符) x86-64 gcc 12.1里面就没有这个字符串了,直接写带代码里。
内存对齐应该是在申请栈空间时做的事情,不同的编译器在处理没有用到的空间的做法也不尽相同,造成strlen输出结果不同。
我认为在等于5时,编译器认为你就想弄一个字符数组,所以没有报任何错误也没填零(这种方式弄字符数组挺方便的- -),但是使用strlen的时候就造成了非期望的结果。
C纯新手 供参考
【 在 shouge111 的大作中提到: 】
: 标 题: 请教一个字符串的问题
: 发信站: 水木社区 (Tue Jul 19 23:50:54 2022), 站内
:
: 变量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;
: }[upload=1][/upload]
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 112.32.8.*]
:
--
修改:Ksharp FROM 182.204.23.*
FROM 182.204.23.*