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

为何实现简易汇编器时比较字符串会触发Segmentation Fault?

解决汇编器字符串比较触发的段错误问题

嘿,我一眼就揪出了你代码里导致段错误的几个关键问题,咱们一步步拆解修复:

核心问题分析

你在第14行调用Comp(&buffer[1], Variables[i])触发段错误,本质原因集中在这几点:

  • NULL指针非法访问:全局变量VariableIndex默认初始值是0,你用calloc(VariableIndex + 1, sizeof(char**))分配了1个元素的数组,但calloc会把内存清零,所以Variables[0]是NULL指针。strcmp函数无法处理NULL指针,直接访问就会触发段错误。
  • 逻辑顺序颠倒:你还没往Variables数组里添加任何变量字符串,就直接尝试搜索匹配——空数组里根本找不到任何变量,这本身就不符合业务逻辑。
  • 内存分配类型错误:Variables是char**类型(指向字符串指针的指针),每个元素是char*,所以你应该用sizeof(char*)而不是sizeof(char**)来分配单个元素的大小。

修复步骤及代码示例

咱们把代码一步步修正,同时补上必要的安全检查:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Comp(a,b) (strcmp(a,b) == 0 ? 1 : 0) // 加括号避免优先级陷阱

char buffer[255], **Variables;
int VariableIndex = 0; // 显式初始化变量索引,避免默认值隐患

void A_instructionHandler() {
    int A_Operand = 0, test = 0; // 初始化变量,杜绝未定义行为
    if (buffer[0] == '@') {
        // 遍历已添加的变量,用i < VariableIndex避免越界
        for (int i = 0; i < VariableIndex; i++) {
            // 先检查指针有效性,防止NULL访问
            if (Variables[i] != NULL) {
                test = Comp(&buffer[1], Variables[i]);
                if (test) {
                    A_Operand = i + 16;
                    printf("找到匹配变量,操作数:%d\n", A_Operand);
                    break;
                }
            }
        }
    }
}

int main(int argumentCounter, char *arguments[]) {
    strcpy(buffer, "@variable");
    
    // 分配初始空间,修正为sizeof(char*)
    Variables = (char **)calloc(1, sizeof(char*));
    if (Variables == NULL) { // 检查内存分配是否成功
        perror("calloc failed");
        return 1;
    }
    
    // 先添加测试变量到Variables数组,再执行搜索逻辑
    Variables[VariableIndex] = strdup("variable"); // strdup自动分配内存并复制字符串
    if (Variables[VariableIndex] == NULL) {
        perror("strdup failed");
        free(Variables);
        return 1;
    }
    VariableIndex++; // 索引自增,准备存储下一个变量
    
    A_instructionHandler();
    
    // 释放内存,避免泄漏
    for (int i = 0; i < VariableIndex; i++) {
        free(Variables[i]);
    }
    free(Variables);
    
    return 0;
}

额外优化建议

  • 添加动态扩容逻辑:当VariableIndex达到当前数组容量时,用realloc扩容数组,这样才能支持任意数量的变量。
  • 减少全局变量依赖:全局变量会让代码耦合度高、难以维护,尽量把buffer、Variables、VariableIndex作为参数传递给函数。
  • 强化错误处理:所有内存分配操作(calloc/strdup/realloc)都要检查返回值,避免后续逻辑在内存不足时崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:31:32