You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);避免内存泄漏。

额外需要修复的问题

  1. 逻辑错误:d2的赋值中错误使用了dcard1,应该改为dcard2:
    d2[0] = conv(dcard2);  // 原代码是dcard1,会导致 dealer 的第二张 card 显示错误
    
  2. 随机数种子重复初始化:srand(time(NULL));放在while (round)循环内部,会导致每次循环重置随机数种子,同一秒内的随机数会完全相同。应该把这行代码移到main函数的开头,只执行一次:
    int main(int argc, string argv[])
    {
        srand(time(NULL));  // 移到这里,仅初始化一次
        bool play = true;
        // ... 后续代码
    }
    
  3. hit函数中的字符串修改问题:hit函数里的string c = "he";同样是字符串字面量,修改c[0]和c[1]也会触发段错误,需要改成字符数组char c[3] = "he";。

内容的提问来源于stack exchange,提问作者Jeremy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:05:37