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");
}

ありがとう !

こんにちは、答えてくれてありがとう!コードを変更して「機能」しましたが、リストを印刷しようとすると、1行ジャンプします。

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

出力は次のとおりです。 [
空白行]
test1test2

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は、変更も初期化もされていません。agendaここで、 offのアドレスをに渡します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 に答える