2014-02-16 44 views
0

我目前做了一些大學工作的C +分配釋放內存(真正的C,只是交換malloc和free的new和delete)。問題在於,即使指針指向該內存空間,編譯器也會重新分配函數中分配的內存,從而在嘗試訪問所述結構字段時導致分段錯誤。下面(簡化的例子)代碼:C++(編譯器?)在功能上

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

C編程。您應該瞭解構造函數,類和對象。它會簡化事情。 – Matt

回答

3

它不正常工作,因爲你是按值傳遞的指針。這意味着,內InsertarUsuario你是剛剛設置的局部變量baseDatosnew分配的內存,沒有有效地給予任何給調用者有用。

你想在調用函數分配內存,並能夠從主叫引用分配的對象。要做到這一點,你需要通過地址本身傳遞指針。所以你將一個指針傳遞給一個指向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; 
    .. 
} 
0

編譯器不釋放內存:你根本不會改變baseDatos值。 InsertarUsuario收到拷貝的指針值(初始爲NULL)和本地更改它,但變量的直接值不會在調用函數中反映出來。這意味着一旦InsertarUsuario返回,baseDatos再次爲NULL。

你要麼需要返回從InsertarUsuariobaseDatos(和停止接受它作爲一個參數),或接受的指針Usuario指針(一個雙指針)或該指針的引用。

0

你傳入baseDatos成InsertarUsuario由值,不能引用(或指針的指針),因此其在RegistrarUsuario函數值不改變。

嘗試改變InsertarUsuario的原型

void InsertarUsuario(Usuario ** baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux) 

,並用C++調用它作爲

InsertarUsuario(&baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);