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

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

我们看看 pascal
notion image
假如要存 len, 就需要额外空间。
但是 C 选择 \0 表示结尾,char const * 存开头。这样就不需要存长度,于是用 while 遍历就很自然。
字符串数据本身存在数据段,不在栈上。用指针去指。
malloc 则是在堆上开空间,用指针指。malloc 后返回的指针不存长度信息。
题外话:这就是为什么 rust 的 string literal 是 &str 类型。
而 String 对应堆上的 vec<u8>

Q:strcmp 为啥相等返回 0

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

Q: 为什么 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的 就不会乱码 (脏话)
Loading...
Steven Lynn
Steven Lynn
喂马、劈柴、周游世界
最新发布
我与 Dify 的半年
2025-3-9
我的2022年终小结
2024-11-9
记录雅思考试经历与一点学习心得
2024-11-9
Hackergame 2024 思路小结
2024-11-9
黑客松、日本、入职:我的2024下半年的总结
2024-11-9
NotionNext:基于Notion和NextJS的开源博客
2024-11-9