我目前正在C +做一些大学工作(实际上是C,只需交换malloc并免费获取新的和删除)。问题是编译器解除了在函数中分配的内存,即使指针指向该内存空间,在尝试访问所述结构字段时也会导致分段错误。 (简化示例)以下代码:
P.S。:我正在使用-Og编译为C ++ 2003标准。
main.cpp中:
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
struct Usu{
long unsigned int DNI;
char Correo[30];
char Nombre[30];
char Foto[20][20];
char *publicaciones;
long unsigned int *amigos;
struct Usu *next;
};
typedef struct Usu Usuario;
void RegistrarU(Usuario *);
void InsertarUsuario(Usuario *, char *, char *, long unsigned int, Usuario *);
int main (int argc, char *argv[]) {
Usuario * baseDatos = NULL;
RegistrarU(baseDatos);
}
void RegistrarU(Usuario * baseDatos)
{
long unsigned int AuxDNI = 34212345;
char AuxNombre[30] = "Hello";
char AuxCorreo[30]= "World";
Usuario *aux = NULL;
InsertarUsuario(baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);
cout<<baseDatos->DNI; //Doesn't work here
system("pause");
}
void InsertarUsuario(Usuario * baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux)
{
baseDatos = new Usuario;
baseDatos->DNI = AuxDNI;
strcpy(baseDatos->Nombre,AuxNombre);
strcpy(baseDatos->Correo,AuxCorreo);
baseDatos->next = NULL;
cout<<baseDatos->DNI; //Works Here
system("pause");
return;
}
答案 0 :(得分:3)
它不起作用,因为您按值传递指针。这意味着在InsertarUsuario
内部,您只需将局部变量baseDatos
设置为new
分配的内存,而无需向调用者提供任何有用的内容。
您希望在被调用函数中分配内存,并且能够从调用者引用已分配的对象。要做到这一点,你需要通过addres本身传递指针。因此,您将指针传递给指向Usuario
的指针。类似的东西:
Usuario * baseDatos = NULL;
RegistrarU(&baseDatos);
void RegistrarU(Usuario ** baseDatos) {
..
InsertarUsuario(baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);
}
void InsertarUsuario(Usuario ** baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux) {
Usuario *tmpUsuario = new Usuario;
*baseDatos = tmpUsuario;
..
}
答案 1 :(得分:0)
编译器不释放内存:您根本不会更改baseDatos
的值。 InsertarUsuario
收到指针值的副本(最初NULL
),本地更改它,但更改为参数的直接值没有反映在调用函数中。这意味着一旦InsertarUsuario
返回,baseDatos
再次为NULL。
您需要从baseDatos
返回InsertarUsuario
(并停止接受它作为参数),或接受指向Usuario
指针的指针(双指针)或对该指针的引用。
答案 2 :(得分:0)
您正在通过值将baseDatos传递给InsertarUsuario,而不是引用(或指针指针),因此其在RegistrarUsuario函数中的值不会更改。
尝试将InsertarUsuario的原型更改为
void InsertarUsuario(Usuario ** baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux)
并将其命名为
InsertarUsuario(&baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);