C中的指针和“非法指令核心已转储”

问题描述

我想编写一个语法分析器,但是当我运行代码时,它给了我这个:

Illegal instruction (core dumped)

现在,我运行了调试器,它告诉我在第一次迭代(因此它不可能是上下文的)时,错误发生在这里

static int list(int poz,int *size) {
...
if(*size==poz)
...

函数调用方式如下:

list(-1,&size);

这是执行工作的整个代码

static int nexttoken() {
  if(pointer==filesize)
    return -1;
  return cchar=file[++pointer];///file is an array where i keep the contents of the file (without spaces)
  
}
static void getint(int *atr) {
  *atr=0;
  while(isdigit(nexttoken()))
    *atr=(*atr)*10+cchar-'0';
  return;
}

///...

static int atom() {
  int integer,size,currentpoz;
  getint(&integer);
  while(cchar=='(') {
    currentpoz=pointer;
    list(-1,&size);
    integer%=size;
    pointer=currentpoz;
    integer=list(integer,&size);
    nexttoken();
  }
  return integer;
}
static int list(int poz,int *size) {
  *size=0;
  int retval=0;
  while(nexttoken()!=')') {
    if(*size==poz)
      retval=atom();
    else
      atom();
    *size++;
  }
  return retval;
}

我在另一个编译器上运行了相同的代码,它告诉我这是段错误(SIGSIEV)。 我不知道是什么引起了这个问题,或者指针怎么给了我这些。

预先感谢

密海

解决方法

*size++;

这可能是罪魁祸首-您没有更新size指向的值,而是在更改size指向另一个对象。 Postfix ++的优先级高于一元*,因此表达式被解析为*(size++)

将其重写为

(*size)++;

看看这是否能解决问题。

,

对于初学者来说,此功能看起来可疑

static int nexttoken() {
  if(pointer==filesize)
    return -1;
  return cchar=file[++pointer];///file is an array where i keep the contents of the file (without spaces)
  
}

表达式++pointer可以等于filesize。这可以调用未定义的行为。

应该是cchar=file[pointer++]吗?

相应地,函数list的调用方式应类似

list( 0,&size);

代替

list(-1,&size);

在函数list中该表达式

*size++;

等同于

*( size++ );

这是指针size指向的对象未被更改。

相反,您必须写

++*size;

当函数依赖全局变量时,这也是一个坏主意。