我正在尝试使用双向链接列表制作BrainFuck(BF)解释器。但是,我浏览此列表的方式似乎对单元格产生了相当奇怪的影响。
所以首先这是我程序的一部分,让我很难过
NSString * methodName = [NSString stringWithUTF8String:sel_getName(method_getName(method))];
char retTyp[10];
method_getReturnType(method, retTyp, 10);
const char * desiredRetType = "B";
if([methodName hasPrefix:@"func"] &&
(0 == strncmp(retTyp, desiredRetType, strlen(desiredRetType))) &&
(2 == method_getNumberOfArguments(method)))
{
SEL testMethod = method_getName(method);
return [self performSelector:testMethod];
}
Cell结构的定义如下:
int main(int argc, char **argv)
{
Cell c = {NULL, NULL, '\0', NULL};
Cell* codeCell = &c;
Cell b = {NULL, NULL, '\0', NULL};
Cell* bandCell = &b;
//init
bandCell->val = '\0';
bandCell->firstCell = bandCell;
codeCell->firstCell = codeCell;
//get code
printf("BF code : ");
codeCell->val=getchar();
while(codeCell->val != '\n') {
if(
codeCell->val=='<'||codeCell->val=='>'
||codeCell->val=='+'||codeCell->val=='-'
||codeCell->val=='['||codeCell->val==']'
||codeCell->val==','||codeCell->val=='.'
) {
newCell(codeCell)->val = getchar();
codeCell = codeCell->nextCell;
}
else {
codeCell->val = getchar();
}
}
}
函数typedef struct Cell Cell;
struct Cell {
Cell* precCell;
Cell* nextCell;
char val;
Cell* firstCell;
};
如下:
Cell* newCell(Cell*)
在这种情况下,我尝试仅按正确的BF指令逐个获取用户输入的char并将其放入单元格中。
我最终有了一个Cell* newCell (Cell* precCell) {
Cell n = {precCell, NULL, '\0', precCell->firstCell};
Cell* newCell = &n;
precCell->nextCell = newCell;
return newCell;
}
,所以我试图找到它的来源,并且我认为它来自第42行的奇怪行为:当我尝试用任何内容更新新创建的单元格的SEGFAULT
时在val
缓冲区中,单元格getchar()
释放了所有值,但我确定它是同一单元格,因为地址仍然相同。在下面的示例中,您可以从GDB中看到我刚才所说的测试。
codeCell->nextCell
我希望这是足够的信息来理解我的问题, 预先感谢您的帮助。