Domanda

Basta un semplice programma per abituarsi ai puntatori. Il programma dovrebbe mettere il contenuto di una parte della mia memoria in un array di caratteri in ordine inverso di come la memoria viene letto. OSSIA guardando decrescente indirizzo di memoria, e voglio conservarlo in ordine decrescente in un array di caratteri.

Il mio compilatore continua a dirmi: "errore di tipi incompatibili in assegnazione"

In linea con il realloc Funzione

Che cosa sto facendo di sbagliato? Mi pare che sia "reverse", e il risultato di realloc dovrebbe essere puntatori al tipo char?

Il mio codice:

int main(){
char  first[]="hello mark", strng='h', reverse[]="";
char* ptr=&first[10];
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

Grazie!

EDIT: Mi dispiace di mis-postato questi come commenti qui sotto

Grazie per l'aiuto, il primo e il secondo commento capito! Ho avuto le #include necessarie, ho solo dimenticato di copiarli nella stack overflow. Avevi ragione, ora mi sono bloccato sulla non-zero finale strlen (). Io risolvo che uno da solo. Grazie ancora!

Ho parlato troppo presto, è compilato bene, ma c'è un errore logico. Il ciclo while verrà eseguito una sola volta. Tuttavia, cicli successivi ancora sicuro, indipendentemente dal valore iniziale di i. La linea che fa sì che il fallimento è la linea che chiama realloc

È stato utile?

Soluzione

Non si può realloc memoria che non è stato malloced in primo luogo. Si dovrebbe dichiarare il contrario come "char *" e malloc per avviare con.

In questo modo farti andare, ma in realtà dovrebbe pensare a reallocing in blocchi, piuttosto che un byte alla volta. Oh, non mi sono preoccupato di risolvere il fatto che "reverse" è probabilmente non NULL terminato quando si tenta lo strlen -. Lascio che come esercizio per il lettore

int main(){
char  first[]="hello mark", strng='h';
char* reverse;
char* ptr=&first[10];
reverse = (char*)malloc(1);
reverse[0] = '\0';
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = (char*)realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

Altri suggerimenti

In entrambi:

  • compila il codice C con un Compilatore C ++. Ecco perché pensa è necessario lanciare il vuoto * ritorna da realloc ad un char *. Il conversione sarebbe legale in C.

o

  • non è riuscito a includere stdlib.h, in modo che il compilatore pensa realloc rendimenti int

Modifica

Dopo aver letto di nuovo il codice, il problema reale è che si sta assegnando ad un array, che non è consentito ad apparire sul lato sinistro di un incarico (non è un 'lvalue'). E 'bene che si accetta la risposta di altri, però. Ha qualche buon consiglio.

  

Non si può realloc memoria che non è stato malloced in primo luogo.

Sì, sicuramente vero, dal momento che al fine di riassegnare, malloc deve avere avere qualche informazione additionnal sul pezzo di memoria di manipolare (sia attraverso un tavolo alocation blocco, o memorizzati nei 4 byte appena prima che il puntatore). Ma si potrebbe ancora scrivere:

char * ptr1 = malloc(16);
char * ptr2 = ptr1 + 8;
ptr2 = realloc(ptr2,32);

E non avrebbe un errore di compilazione. Si potrebbe ancora probabilmente ottenere un segfault in fase di esecuzione, però.

Tuttavia, v'è una differenza fondamentale nel modo in cui un compilatore C ossequi

char * tab = "toto";

e

char tab[] = "toto";

Nel primo caso, scheda è un puntatore, di tipo char *, ed è un valore assegnabile come qualsiasi normale variabile. Probabilmente risiede in un registro la maggior parte del tempo, o potrebbe essere un indirizzo sul mucchio. Nel secondo caso, tab è un array, una costante, e non è quindi un Ivalue. Probabilmente è sostituito a livello di assieme da un indirizzo che punta alla sezione di testo del binario eseguibile, in cui i dati per la stringa "toto" risiede.

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