Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化结构时发生访问冲突_C_Pointers_Initialization_Stack_Rpn - Fatal编程技术网

C 初始化结构时发生访问冲突

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() 这些是用于堆栈的函数

我已经为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
(或者您在其他地方调用了未定义的行为)。为了得到更好的帮助,发布一个真正的程序来解决问题。