2016-09-28 4 views
2

Ich habe Probleme, den folgenden Algorithmus ohne Index arbeiten (mit Index funktioniert es). Es ist eine kleine Übung für meine Universität, und eine der Anforderungen ist, dass ich nur "Zeigerreferenz" verwenden kann, um durch mein zugewiesenes Array (Frase) zu gehen, nicht zu indexieren. Was ich zuletzt versucht habe, um es zum Laufen zu bringen, ist kommentiert, und ich gebe auf, weil alles, was ich versuche, nicht funktioniert ... Danke für die Hilfe.Zeiger als Index eines Arrays - C

#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 

int main(){ 
    char* frase; 
    frase = malloc(sizeof(char) * 100); 

    gets(frase); 

    /* 
    while(*frase != '\0'){ 
     printf("%c", *frase); 
     frase++; 
    } 
    */ 
    int i = 0; 
    while(frase[i]){ 
     printf("%c", toupper(frase[i])); 
     i++; 
    } 

    printf("\n"); 
    free(frase); 
} 
+1

Was hat nicht funktioniert? Der kommentierte Code scheint in Ordnung zu sein. Abgesehen von der Tatsache, dass Sie es später nicht "befreien" können, da Sie den ursprünglichen Zeiger verlieren. Sie müssen es also vor dem Inkrementieren speichern. –

+0

do 'while (* (frase + i))' und 'toupper (* (frase + i))'. Ändere diese zu denen, die ich geschrieben habe, und versuche es erneut :) – d3r1ck

+0

Eugene, mit dem kommentierten Code bekam ich eine Menge Abstürze und meinen PC neustarten, wahrscheinlich wegen schlechtem Speicher verwalten oder etwas ... –

Antwort

3

Das Problem ist, dass Sie einen Zeiger befreien, die sich geändert hat (in der Tat hat frasefrase++ erhöht wurde unter Verwendung) dann free(frase) funktioniert nicht.

+0

Ich stimme zu, dass frei ist ein Problem, aber mein Hauptproblem war meine, während eine Endlosschleife sein, bis mein PC abstürzt ... Wie auch immer es jetzt gelöst ist, danke! –

3

Durch die Verwendung von „Zeiger nur“ Punkt, den Sie auf ein Element, das Verfahren und erhöht dann den Zeiger auf das nächste Element zeigen:

char *pfrase = frase; 
while(pfrase){ 
    printf("%c", toupper(pfrase)); 
    pfrase++; 
} 
+0

Ich benutzte ur-Code innerhalb MD XF-Logik: while (* pfrase), toupper (* pfrase) und * pfrase ++, und es funktioniert gut. Vielen Dank! –

1

Der Wert des zu free gebene Argument ein Zeiger sein muss, dass wurde von einer der malloc Familie von Funktionen zurückgegeben. Wenn ein anderer Wert an free übergeben wird, hat das Programm undefiniertes Verhalten.

Wenn Sie:

frase = malloc(sizeof(char) * 100); 

gets(frase); 

while(*frase != '\0'){ 
    printf("%c", *frase); 
    frase++; 
} 

free(frase); 

Sie rufen free mit einem Zeiger, dessen Wert ist anders als die von malloc zurückgegebene Wert. Das ist Ursache für undefiniertes Verhalten.

Eine Möglichkeit, dies zu lösen, haben Sie bereits getan - verwenden Sie einen Index, um auf das Array zuzugreifen.

Eine andere Möglichkeit, dies zu lösen, besteht darin, eine andere Variable zu verwenden, um über den Inhalt des Arrays zu iterieren.

frase = malloc(sizeof(char) * 100); 

gets(frase); 

// Don't modify frase. Use another variable to iterate 
char* cp = frase; 
while(*cp != '\0'){ 
    printf("%c", *cp); 
    cp++; 
} 

free(frase); 
-1

Mit allen Antworten funktioniert mein Algorithmus jetzt. Hier ist, was seine jetzt:

 #include <stdlib.h> 
     #include <stdio.h> 
     #include <ctype.h> 

     int main(){ 

      char* frase; 
      frase = malloc(sizeof(char) * 100); 

      gets(frase); 

      char* pointer = frase; 
      while(*pointer){ 
       printf("%c", toupper(*pointer)); 
       *pointer++; 
       } 


      printf("\n"); 
      free(frase); 
      free(pointer); 
      } 

Sowohl das Problem der Sie nicht bearbeiten meine „frase“ Array und das nutzlose frei Problem scheint gelöst zu werden. Auch ich weiß über das Problem, aber dieser Algorithmus ist für eine Übung. Danke allen für die Hilfe!

+0

Ai !!! Sie können 'pointer' nicht freigeben, weil es auf' frase' gezeigt hat, und Sie 'befreite'' frase' bereits! - Entfernen Sie die 'free (Zeiger);' –

+0

hmmm, jetzt sehe ich es. Vielen Dank! –