C ++数据结构列表,我的代码中的错误

时间:2012-10-11 14:32:48

标签: c++ list data-structures

您好我试图编译我的代码,但我得到了一次违规错误。我试图制定一个议程,我可以使用列表插入值。我的代码中有什么错误?

#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;
}

输出结果为:
    [blankline]
    test1的
    TEST2

4 个答案:

答案 0 :(得分:4)

很高兴看到实际的编译器错误,看看哪一行导致了问题。

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

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

应该是

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

或者,甚至更好,

p = new ap_agenda;

因为,目前,你只是malloc()足够大的指针,而不是实际的结构。

答案 1 :(得分: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 ++书!!!

答案 2 :(得分:1)

访问冲突可能来自您对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尚未以任何方式修改或初始化。现在,您将agenda的地址移至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的{​​{1}}和telefone尚未初始化。

agenda

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

name

相反,如果您传递了void imprime(ap_agenda *lista){ cout << lista[0].name << endl; // possible access violation } proximo agenda成员,该成员已在insere中初始化,您会看到name值已打印。

    imprime(agenda->proximo);

然而,正如其他人所指出的,此代码中还有很多其他问题。

答案 3 :(得分:0)

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

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

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

我会猜测你的问题