为何实现简易汇编器时比较字符串会触发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
相关产品推荐
相关产品推荐

