C 初始化结构时发生访问冲突
我已经为RPN计算器编写了一个代码,它适用于基本运算符(+、*、/、^),也适用于浮点数和负数。它还计算表达式,如 (x^2+x*4/-2):1->5:0.5(x从1到5计算,步数为0.5) 我使用了字符堆栈。 现在,我想添加对cos(x)、tan(x)等函数的支持。为了达到这个目的,我需要构建一个char*堆栈,在解析后存储sin、cos、sqrt等单词 问题是,在初始化堆栈时,我得到一个“访问冲突:写入地址0x01”错误 我不知道确切的原因。可能是使用了malloc() 这些是用于堆栈的函数C 初始化结构时发生访问冲突,c,pointers,initialization,stack,rpn,C,Pointers,Initialization,Stack,Rpn,我已经为RPN计算器编写了一个代码,它适用于基本运算符(+、*、/、^),也适用于浮点数和负数。它还计算表达式,如 (x^2+x*4/-2):1->5:0.5(x从1到5计算,步数为0.5) 我使用了字符堆栈。 现在,我想添加对cos(x)、tan(x)等函数的支持。为了达到这个目的,我需要构建一个char*堆栈,在解析后存储sin、cos、sqrt等单词 问题是,在初始化堆栈时,我得到一个“访问冲突:写入地址0x01”错误 我不知道确切的原因。可能是使用了malloc() 这些是用于堆栈的函数
typedef struct nodo{
char *operador;
struct nodo *next;
}tipo;
typedef tipo *elemento;
typedef tipo *top;
int push(top*,char*) ;
void init(top *);
void libera(top*);
char* pop(top*);
int main(){
(...)
top op;
init(&op);
(...)
}
void init(top *pila) {
*pila = malloc(sizeof(**pila));
(*pila)->operador = NULL;
(*pila)->next = NULL;
}
void libera(top *pila) {
free(*pila);
*pila = NULL;
}
int push (top *last,char *dato){
elemento new1;
int j=strlen(dato);
new1 = (elemento)malloc(sizeof(tipo));
strncpy(new1->operador, dato,j);
new1->next=*last;
*last=new1;
;}
char* pop(top *last){
elemento aux;
char* caract;
aux = (elemento)malloc(sizeof(tipo));
aux=*last;
if (!aux)
return 0;
*last=aux->next;
strcpy(caract,aux->operador);
free(aux);
return caract;
}
改变
*pila = malloc(sizeof(**pila));
到
这是一个bug(以两种不同的方式):
strncpy
不会生成字符串(即,它不会放置空终止符),因为您指定的缓冲区大小不够大。第三个参数是输出缓冲区大小,而不是输入长度
此外,new1->operador
是一个未初始化的指针。你没有给它留空间
要解决此问题,请执行以下操作:
init(&new1);
new1->operador = malloc( strlen(dato) + 1 );
strcpy(new1->operador, dato);
下面是另一个bug:
aux = (elemento)malloc(sizeof(tipo));
aux=*last;
strcpy(caract,aux->operador);
aux
在这里是一个指针(因为您使用了指针typedefs,所以它是伪装的)。第二行指向*last
指向的位置,导致内存泄漏。您可能想将*last
指向的数据复制到aux
指向的空间中:
*aux = **last;
但是你还有另一个bug:
aux = (elemento)malloc(sizeof(tipo));
aux=*last;
strcpy(caract,aux->operador);
你还没有把caract
指向任何地方
代码中的其他地方可能有bug;到目前为止,我只是注意到了这些。您的代码很难阅读,因为所有的指针类型都是def。如果你去掉指针typedef,这会有帮助
我建议你不要一次写那么多代码;编写一个函数,然后对其进行彻底测试,一旦确定它可以工作,就转到下一个函数。它也不能工作,我也会遇到同样的“访问冲突”错误。谢谢你要把什么传给init?请显示declaration.int main(){(…)top op;init(&op);(…)}@n3rd4n1原始代码比您的suggestion@MattMcNabb一个扭曲你大脑的代码怎么可能比一个简单的代码更好呢?还有更多的bug。刚刚注意到这个:
aux=malloc(…);aux=*最后一个。分配内存并立即丢失对它的引用。多亏了这两者!我已经做了您指出的更改,在init()中的行*pila=malloc(sizeof(**pila))中仍然是相同的错误//
这意味着您正在使用野生指针调用init
(或者您在其他地方调用了未定义的行为)。为了得到更好的帮助,发布一个真正的程序来解决问题。