0

您好,我试图编译我的代码,但出现访问冲突错误。我试图制定一个议程,我可以使用列表插入值。我的代码有什么错误?

#include <stdio.h>
#include <iostream>

using namespace std;

typedef struct ap_agenda{
    char *name;
    char *telefone;
    struct ap_agenda *proximo;
};

void init(ap_agenda* lista){
    lista = NULL;
}

void insere(char *nome, char *telefone, ap_agenda* lista){
    ap_agenda *p;
    p = (ap_agenda*) malloc(sizeof(ap_agenda*));
    p->name = nome;
    p->telefone = telefone;

    if(lista == NULL){
        lista = p;
    }else{
        lista->proximo = p;
    }
}

void imprime(ap_agenda *lista){
    cout << lista[0].name << endl;
}

int main(){
    ap_agenda agenda;

    init(&agenda);
    insere("test","123456",&agenda);
    imprime(&agenda);

    system("pause");
}

谢谢 !

您好,感谢您的回答!我更改了我的代码,现在它“工作”了,但是当我尝试打印列表时,它跳了一行。

void insere(std::string nome, std::string telefone, ap_agenda* lista){
ap_agenda *p = new ap_agenda;

p->name = nome;
p->telefone = telefone;
p->proximo = NULL;

if(lista == NULL){
    lista = p;
}else{
    while(lista->proximo != NULL)
        lista = lista->proximo;

    lista->proximo =  p;
    }
}

void print(ap_agenda* lista){
    ap_agenda *p;
    for(p=lista; p!=NULL; p=p->proximo)
        cout << p->name.c_str() << endl;
}

输出为:
[空白行]
test1
test2

4

4 回答 4

4

很高兴看到实际的编译器错误以查看导致问题的行。

如果没有编译器输出,我可能会猜测问题出在

p = (ap_agenda*) malloc(sizeof(ap_agenda*));

这可能应该是

p = (ap_agenda*) malloc(sizeof(ap_agenda));

或者,甚至更好,

p = new ap_agenda;

因为,目前,您只是 malloc() 为指针提供了足够的大小,而不是实际的结构。

于 2012-10-11T14:44:02.900 回答
1

多个错误 - 首先你不是在编写 C++ 代码,而是 C 代码。

void init(ap_agenda* lista){
    lista = NULL;
}

初始化为NULL临时lista. 外,lista不变。

除此之外:

ap_agenda *p;
p = (ap_agenda*) malloc(sizeof(ap_agenda*));

仅分配指针大小的内存,而不是对象。而你使用malloc而不是new. 可怕。

你也永远不会释放内存。

阅读一本好的 C++ 书籍!!!

于 2012-10-11T14:37:34.223 回答
0

访问冲突可能来自您的调用,insere它不像您认为的那样工作。

int main(){
    ap_agenda agenda; //<-- local variable lives on the stack

    init(&agenda); //<-- passes the address of the local variable

当它传递给 init 时:

void init(ap_agenda* lista){ // lista is a temporary variable that contains a
                             // copy of the address
    lista = NULL; //<-- this overwrites the value in the temporary variable.
} // when this function returns, the temporary variable is destroyed.

此时agenda尚未以任何方式修改或初始化。现在您将agendaoff 的地址传递给insere.

    insere("test","123456",&agenda);

insere被定义为

void insere(char *nome, char *telefone, ap_agenda* lista){
    ap_agenda *p;
    p = (ap_agenda*) malloc(sizeof(ap_agenda*)); // you allocate a new `ap_agenda`
                                                 // pointer. not enough for a struct
    p->name = nome; // initialize name (probably ok but not what you expect)
    p->telefone = telefone;  // initialize telefone (possible access violation)

    if(lista == NULL){ // since lista is the address of a stack variable it won't
                       // be NULL here
        lista = p;
    }else{
        lista->proximo = p; // this sets the allocated struct to the `proximo` member
                            // of the stack variable that was passed in
    }
}

请注意,当这个返回时,nome堆栈telefone变量agenda还没有被初始化。

    imprime(&agenda);

当堆栈变量的地址agenda被传递给imprime它时,它会尝试打印name尚未初始化的值。

void imprime(ap_agenda *lista){
    cout << lista[0].name << endl; // possible access violation
}

相反,如果您传入已初始化的proximo成员,您将看到打印的值。agendainserename

    imprime(agenda->proximo);

但是,正如其他人指出的那样,此代码中还有很多其他问题。

于 2012-10-11T14:41:21.163 回答
0
 p = (ap_agenda*) malloc(sizeof(ap_agenda*));

在这里您分配指针的大小,而不是结构的大小!因此任何对 p->xxx 的访问都可能导致内存访问错误。

p = (ap_agenda*) malloc(sizeof(ap_agenda));

我想会解决你的问题

于 2012-10-11T14:37:05.850 回答