C语言实现二十一点时出现Segmentation Fault问题求助
排查二十一点程序中的Segmentation Fault错误
核心错误原因
你遇到的段错误(Segmentation Fault)直接原因是修改了字符串字面量的内容。在C语言(包括CS50的string类型,本质是char*)中,像string p1 = "hello";这样的语句会让指针指向只读内存区域中的字符串字面量,这类内存不允许被修改。当你执行p1[1] = ' ';时,试图写入只读内存,就会触发段错误。
修复方案
把所有需要修改的字符串改为可写内存,有两种常用方式:
1. 使用字符数组替代字符串字面量
将定义语句从:
string p1 = "hello";
改为:
char p1[6] = "hello"; // 数组大小要包含结束符'\0'的位置
同理,p2、d1、d2以及hit函数中的string c = "he";都需要改成字符数组:
char c[3] = "he";
2. 动态分配可写内存
如果需要更灵活的内存管理,可以用malloc分配内存并复制字面量:
string p1 = malloc(6); strcpy(p1, "hello");
注意:使用完动态分配的内存后,要调用free(p1);避免内存泄漏。
额外需要修复的问题
- 逻辑错误:
d2的赋值中错误使用了dcard1,应该改为dcard2:d2[0] = conv(dcard2); // 原代码是dcard1,会导致 dealer 的第二张 card 显示错误 - 随机数种子重复初始化:
srand(time(NULL));放在while (round)循环内部,会导致每次循环重置随机数种子,同一秒内的随机数会完全相同。应该把这行代码移到main函数的开头,只执行一次:int main(int argc, string argv[]) { srand(time(NULL)); // 移到这里,仅初始化一次 bool play = true; // ... 后续代码 } hit函数中的字符串修改问题:hit函数里的string c = "he";同样是字符串字面量,修改c[0]和c[1]也会触发段错误,需要改成字符数组char c[3] = "he";。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

