C 的目标是更“友善的汇编”,所以很多设计逻辑要从汇编看。
Q:为什么 C 的 str 基本是 const char *(栈) 或者 malloc 再填(堆)?Q:strcmp 为啥相等返回 0Q: 为什么 C 不能返回局部变量地址Q: 为什么 Galgame 会乱码
Q:为什么 C 的 str 基本是 const char *(栈) 或者 malloc 再填(堆)?
我们看看 pascal

假如要存 len, 就需要额外空间。
但是 C 选择
\0
表示结尾,char const * 存开头。这样就不需要存长度,于是用 while 遍历就很自然。字符串数据本身存在数据段,不在栈上。用指针去指。
malloc 则是在堆上开空间,用指针指。malloc 后返回的指针不存长度信息。
题外话:这就是为什么 rust 的 string literal 是 &str 类型。
而 String 对应堆上的 vec<u8>
Q:strcmp 为啥相等返回 0
因为 c 不支持
str1 < str2
,所以用 strcmp 的返回值符号代表大小,相等 return 0Q: 为什么 C 不能返回局部变量地址
调用函数时,对于 local var a 会压栈,调用结束就弹栈。
c 返回都是传值,放在 eax 寄存器。
所以 return a 是 return 值,a 变量本身在弹栈就寄了。
所以不能 return local var 的 pointer
也不能什么 int* b = &foo()
Q: 为什么 Galgame 会乱码
逆向可知基本用的是 MessageBox 系列的 A, 即 MessageBoxA, A 对应 ascii
flaribbit
这一点还得骂 c/cpp 连个靠谱的编码转换接口都没有
wchar 转换很不爽
[In reply to Asuka Minato️]
你逆向估计也看到了
winapi 有两套接口 比如 MessageBox
分为 MessageBoxA 和 MessageBoxW
Asuka Minato️
[In reply to flaribbit]
y
a 一直看到
w 基本没
flaribbit
前者默认本地 locale 不对就乱码
W 是 wchar/utf-16的 就不会乱码
(脏话)