MinGW-w64 编译通过运行崩?Code Runner 踩坑记

症状 VS Code 里写了个 hello world: #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; return 0; } Ctrl+Alt+N(Code Runner)→ 编译通过 → 运行崩: [Done] exited with code=3221225477 in 1.097 seconds 退出的 3221225477 就是 0xC0000005,也就是 STATUS_ACCESS_VIOLATION——俗称段错误(segfault)。 一个 hello world 能 segfault,说明问题不在代码,在环境。 排查 第一坑:路径错了 看看编译器的实际位置: $ ls /d/Apps/mingw64/mingw64/bin/g++.exe 结果是 MinGW-w64 15.2.0(UCRT 版本),而我 Code Runner 里配的是 D:\Apps\TDM-GCC\bin\g++.exe——一个根本不存在的目录。 嗯,之前不知道哪个助手写进记忆里的,信了。 第二坑:运行时缺 DLL 路径改对后,编译确实过了,但运行还是崩。手动跑一下试试: $ g++ hello.cpp -o hello.exe -static-libgcc -fexec-charset=gbk $ ./hello.exe Segmentation fault 查一下编译产物依赖的 DLL: $ objdump -p hello.exe | grep "DLL Name" DLL Name: libstdc++-6.dll DLL Name: KERNEL32.dll DLL Name: api-ms-win-crt-environment-l1-1-0.dll DLL Name: api-ms-win-crt-heap-l1-1-0.dll ... 看到了吧——libstdc++-6.dll。这个 DLL 在 MinGW 的 bin 目录下,但不在系统的 PATH 里。运行时找不到它,直接崩。 ...

2026/07/13 · 1 min · 192 words · zzy2357

C++ String

创建 #include <string> // 注意不是 <string.h> string s; 转字符数组 string.data() 不保证末尾有空字符 string.c_str() 保证末尾有空字符,建议用这个 获取长度 string.size() string.length() strlen(string.c_str()) 注意! 这三个函数(以及下面将要提到的 find 函数)的返回值类型都是 size_t(unsigned long).因此,这些返回值不支持直接与负数比较或运算,建议在需要时进行强制转换. 查找 string.find(str, pos = 0) 查找字符串中一个字符/字符串在含 pos 之后第一次出现的位置,如果没有出现,则为 string::npos(类型为 size_t/unsigned long,需转换) 截取 string.substr(pos, len) 返回从 pos 位置开始截取最多 len 个字符组成的字符串 插入 string.insert(index, count, char) 在 index 处连续插入 count 个 char string.insert(index, str) 在 index 处插入 str 擦除 string.erase(index, count = string.length()) 将从含 index 开始的 count 个字符删除 替换 string.replace(pos, count, str) 将从含 pos 后面的 count 个字符替换为 str string.replace(first: iterator, last: iterator, str) 将以含 first 开始,不含 last 结束的字串替换为 str

2026/03/09 · 1 min · 89 words · zzy2357

C++ Vector

创建 vector #include <vector> vector<int> v0; // 创建一个初始空间为 3 的 vector,元素默认值为 0 vector<int> v1(3); // 创建一个初始空间为 3 的 vector,元素默认值是 2 vector<int> v2(3, 2); // 创建一个 v2 的拷贝 v3,元素内容和 v2 一样 vector<int> v3(v2); // 创建一个 v3 的拷贝到 v4,内容是 { v3[1], v3[2] },包前不包后; vector<int> v4(v3.begin() + 1, v3.begin() + 3); 元素访问 vector.at(pos) 返回 vector 中下标为 pos 的引用 vector[pos] 返回 vector 中下标为 pos 的引用,不执行越界检查 vector.front() 返回首元素的引用(vector.begin() 是迭代器,和这个不同) vector.back() 返回末元素的引用 (vector.end() 是迭代器,没有元素,和这个不同) vector.data() 返回首元素的指针(vector 的空间是连续的) 迭代器 vector.begin() 返回首元素的迭代器,*begin = front vector.end() 返回末元素的迭代器,没有元素 vector.rbegin() 返回指向逆向数组的首元素的迭代器,可以理解为正向容器的末元素 vector.rend() 返回指向逆向数组末元素后一位置的迭代器,对应容器首的前一个位置,没有元素 上述迭代器名前加上一个 c 为只读迭代器 长度和容量 注意,vector 的长度(size)指有效元素数量,而容量(capacity)指分配的内存长度 ...

2026/03/09 · 1 min · 156 words · zzy2357