您好我试图编译我的代码,但我得到了一次违规错误。我试图制定一个议程,我可以使用列表插入值。我的代码中有什么错误?
#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
答案 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));
我会猜测你的问题