C 的目标是更“友善的汇编”,所以很多设计逻辑要从汇编看。

Q:为什么 C 的 str 基本是 const char *(栈) 或者 malloc 再填(堆)?

我们看看 pascal

Untitled

假如要存 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>


Q:strcmp 为啥相等返回 0

因为 c 不支持 str1 < str2 ,所以用 strcmp 的返回值符号代表大小,相等 return 0


Q: 为什么 C 不能返回局部变量地址

调用函数时,对于 local var a 会压栈,调用结束就弹栈。

c 返回都是传值,放在 eax 寄存器。