C 的目标是更“友善的汇编”,所以很多设计逻辑要从汇编看。
我们看看 pascal
假如要存 len, 就需要额外空间。
但是 C 选择 \\0
表示结尾,char const * 存开头。这样就不需要存长度,于是用 while 遍历就很自然。
while(*dst++ = *src++);
字符串数据本身存在数据段,不在栈上。用指针去指。
malloc 则是在堆上开空间,用指针指。malloc 后返回的指针不存长度信息。
题外话:这就是为什么 rust 的 string literal 是 &str 类型。
Proper way to return a new string in Rust
而 String 对应堆上的 vec<u8>
因为 c 不支持 str1 < str2
,所以用 strcmp 的返回值符号代表大小,相等 return 0
调用函数时,对于 local var a 会压栈,调用结束就弹栈。
c 返回都是传值,放在 eax 寄存器。