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

自定义指令集架构汇编器字符串拆分异常问题求助及解决方案

自定义ISA汇编器Token拆分异常问题求助

我已经为这个问题折腾好几个小时了,却始终找不到代码里的问题所在。目前我正在为一款自定义指令集架构(Instruction Set Architecture, ISA)编写一个简易汇编器,它的功能是读取输入文件并逐行解析——解析时我计划把每行内容按空格拆分,将生成的Token存入数组供后续处理。

下面是我实现Token拆分功能的部分代码:

char** tokens = (char**) malloc(sizeof(char*));
char* linecpy = strcpy(linecpy, line);
char* tok_ptr = strtok(linecpy, " ");
int tokenid = 0;
while(tok_ptr) {
    tokens = (char**) realloc(tokens, (tokenid+1) * sizeof(char*));
    tokens[tokenid] = tok_ptr;
    tokenid++;
    tok_ptr = strtok(NULL, " ");
}

为了测试功能是否正常,我让程序依次打印数组里的每个Token,结果发现本该完整的Token出现了随机拆分的情况:

汇编文件中的行:jsr fibloop ; jump to the main program loop
预期输出(按空格拆分):jsr、fibloop、;、jump、to、the、main、program、loop
实际输出:jsr、fibloo、p、;、jump、to、the、main、pr、ogram、l、oop

我花了大量时间尝试解决却毫无进展,希望能得到大家的反馈和潜在解决方法。


问题修正与补充

感谢社区成员Clifford和4386427的快速回复,他们指出了问题的根源:linecpy未分配内存,且我错误地认为strcpy会直接返回一个新字符串。

以下是修正后的可用代码,同时我还按照Clifford的建议添加了注释过滤功能——当解析器遇到注释字符;时就停止Token化,因为后续内容都是注释,对解析器没有意义:

char** tokens = (char**) malloc(sizeof(char*));
// 为linecpy分配足够内存:原字符串长度+1(存储终止符)
char* linecpy = malloc(strlen(line) + 1);
strcpy(linecpy, line);
char* tok_ptr = strtok(linecpy, " ");
int tokenid = 0;
while(tok_ptr) {
    /* 如果Token以注释字符开头,则停止Token化,后续内容均为注释 */
    if(tok_ptr[0] == ';') break;
    tokens = (char**) realloc(tokens, (tokenid+1) * sizeof(char*));
    tokens[tokenid] = tok_ptr;
    tokenid++;
    tok_ptr = strtok(NULL, " ");
}
// 解析完成后记得释放tokens分配的内存
free(tokens);

希望这段修正后的代码能帮助遇到相同问题的人,社区的帮助真的很大,再次感谢!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:07:43