Domanda

Ho semplificato un problema che ho avuto cercando di isolare il problema, ma non è d'aiuto.

Ho una matrice 2 char bidimensionale per rappresentare memoria. Voglio passare un riferimento a tale simulazione di memoria a una funzione. Nella funzione di verificare il contenuto della memoria Voglio solo per scorrere la memoria e stampare il contenuto su ogni riga.

Il programma stampa fuori dalla prima fila in tanto sono colpa seg.

Il mio programma è il seguente:

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

void test_memory(char*** memory_ref)  {

    int i;
    for(i = 0; i < 3; i++)  {
        printf("%s\n", *memory_ref[i]);
    }
}

int main()  {
    char** memory;
    int i;
    memory = calloc(sizeof(char*), 20);
    for(i = 0; i < 20; i++)  {
        memory[i] = calloc(sizeof(char), 33);
    }

    memory[0] = "Mem 0";
    memory[1] = "Mem 1";
    memory[2] = "Mem 2";

    printf("memory[1] = %s\n", memory[1]);

    test_memory(&memory);

    return 0;
}

Questo mi dà l'output:

memory[1] = Mem 1
Mem 0
Segmentation fault

Se cambio il programma e creare una versione locale della memoria nella funzione dal dereferenziazione il memory_ref, allora ottengo l'uscita a destra:

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

void test_memory(char*** memory_ref)  {

    char** memory = *memory_ref;
    int i;
    for(i = 0; i < 3; i++)  {
        printf("%s\n", memory[i]);
    }
}

int main()  {
    char** memory;
    int i;
    memory = calloc(sizeof(char*), 20);
    for(i = 0; i < 20; i++)  {
        memory[i] = calloc(sizeof(char), 33);
    }

    memory[0] = "Mem 0";
    memory[1] = "Mem 1";
    memory[2] = "Mem 2";

    printf("memory[1] = %s\n", memory[1]);

    test_memory(&memory);

    return 0;
}

mi da seguente output:

memory[1] = Mem 1
Mem 0
Mem 1
Mem 2

, che è quello che voglio, ma fare una versione locale della memoria è inutile perché ho bisogno di essere in grado di cambiare i valori della memoria originale dalla funzione che posso fare solo dereferenziazione il puntatore char 2d originale matrice.

Non capisco perché dovrei ottenere un guasto seg sulla seconda volta, e sarei grato per qualsiasi consiglio.

Molte grazie

Joe

È stato utile?

Soluzione

Prova:

printf("%s\n", (*memory_ref)[i]);

La versione attuale è equivalente a

*(*(memory_ref + i));

Questo perché l'operatore ha la precedenza [] superiore alla * dereference. Il che significa che quando i è maggiore di 0 si tenta di leggere la memoria dopo la char*** temporanea memory_ref

La seconda versione è uguale a (*memory_ref)[i] che significa che vi sarà indicizzazione memoria corretta.

Modifica Il motivo per cui funziona alla prima iterazione è perché:

*(*(memory_ref + 0)) == *((*memory_ref) + 0)

Altri suggerimenti

Questo appare come un problema di precedenza. Il [] è sempre valutata per prima, e la seconda *. Quello che vi serve è qualcosa di simile a quanto segue per il vostro primo esempio di codice ...

printf("%s\n", (*memory_ref)[i]);

La soluzione rapida è quella di utilizzare

printf("%s\n", (*memory_ref)[i]);

Ma ho il sospetto di avere un problema nelle linee

 memory[0] = "Mem 0";

Questi non copiare la stringa "Mem 0" nel vostro array di memoria. Fanno memoria punto [i] alla stringa.

È necessario copiare esplicitamente i dati utilizzando strncpy

es.     char s = "mem 0";     strncpy (memoria 1 , s, max (strlen (s) + 1, 29) ) // max di 30 = (29 + char '\ 0', come cioè la lunghezza riga che si assegnato - meglio #define questo come una costante

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top