2012-04-12 4 views
1

Dies ist ein C-Programmierproblem.Wie kann man einen zweidimensionalen Zeiger außerhalb einer Funktion übertragen, so dass auf den Speicher, auf den der Zeiger zeigt, zugegriffen werden kann?

Ich muss einen 2-d-Zeiger außerhalb einer Funktion f() übertragen, damit andere Funktionen auf den Speicher zugreifen können, der innerhalb f() zugewiesen wird.

aber bekam ich Segmentation fault bei „Fehler hier“, wenn i> 1.

Wie 2-d-Zeiger zu tun, so dass das Eingabeargument wirklich von außen Funktion verwendet werden kann? Ich bezweifle, dass *ba = (dp[0]); etwas falsch ist.

warum?

typedef struct { 
    char* al; /* '\0'-terminated C string */ 
    int sid; 
} strtyp ; 

strtyp *Getali(void) 
{ 
    strtyp *p = (strtyp *) malloc(sizeof(strtyp)) ; 
    p->al = "test al"; 
    p->sid = rand(); 
    return p; 
} 

strtyp *GetNAl(void) 
{ 
    strtyp *p = (strtyp *) malloc(sizeof(strtyp)) ; 
    p->al = "test a"; 
    p->sid = rand(); 
    return p; 
} 

int *getIDs2(strtyp **ba, int *aS , int *iSz) 
{ 
    int *id = (int *) malloc(sizeof(int) * 8) ; 
    *idS = 8 ; 
    int length = 10; 
    int i ; 
    strtyp **dp = (strtyp **) malloc(sizeof(strtyp*)*length) ; 
    for(i = 0 ; i < length ; ++i) 
    { 
     dp[i] = GetNAl(); 
     printf("(*pd)->ali is %s ", (*pd[i]).ali); 
     printf("(*pd)->sid is %d ", (*pd[i]).sid); 
     printf("\n"); 
    } 
    *ba = (dp[0]); 
    for(i = 0 ; i < length ; ++i) 
    { 
     printf("(*ba)->ali is %s ", (*ba[i]).ali); // error here 
     printf("(*ba)->sid is %d ", (*ba[i]).sid); 
     printf("\n"); 
    } 

    *aIs = length ; 
    return id; 
} 
+0

Wo ist dp erklärt? –

+0

Entschuldigung, Tippfehler, danke – user1002288

Antwort

4

Wenn Sie eine strtyp ** Variable in der aufrufenden Funktion gesetzt werden sollen, muss das Argument ein Zeiger auf diese Art sein - strtype ***. So würde Ihre Funktion wie folgt aussehen:

int *getIDs2(strtyp ***ba, int *aS, int *iSz) 
{ 
    /* ... */ 
    strtyp **pd = malloc(sizeof pd[0] * length) ; 

    for(i = 0 ; i < length ; ++i) 
    { 
     pd[i] = GetNAl(); 
     printf("(*pd)->ali is %s ", pd[i]->ali); 
     printf("(*pd)->sid is %d ", pd[i]->sid); 
     printf("\n"); 
    } 

    *ba = pd; 

    for(i = 0 ; i < length ; ++i) 
    { 
     printf("(*ba)->ali is %s ", (*ba)[i]->ali); 
     printf("(*ba)->sid is %d ", (*ba)[i]->sid); 
     printf("\n"); 
    } 

    /* ... */ 
} 

... und Ihre Anrufer aussehen würde:

strtyp **x; 

getIDs2(&x, ...); 
Verwandte Themen