codice C semplice, con irritante “tipi incompatibili nell'assegnazione” Errore
-
22-08-2019 - |
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
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 pensarealloc
rendimentiint
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.