verkehrte string und speicherverwaltung

Upsala, stimmt, da habe ich mich verlesen.
Auf cplusplus.com steht:
The function may move the memory block to a new location (whose address is returned by the function).
Und das habe ich fälschlicherweise als "möglicherweise" interpretiert.

Asche auf mein Haupt
cwriter
 
Hallo ! Ich hab da mal eine Frage wo wird denn hier überprüft wann der Speicher voll ist und erweitert werden muss ?! Fehlt da nicht eine if ?


Code:
int main(int argc, char* argv[])
{
    char* speicher = NULL;
    char* tmp = NULL;
    size_t size = 0;
    char c = 0;
    while((c = fgetc(stdin)) != EOF)
    {
        size++;
        tmp = (char*)malloc(size);
        if(tmp == NULL)
        {
            printf("Error: Out of memory!\n");
            return 1;
        }
        memcpy(tmp,speicher,size);
        speicher = (char*)realloc(speicher,size);
        if(speicher == NULL)
        {
            printf("Error: Out of memory!\n");
            return 1;
        }
        memcpy(speicher,tmp,size);
        speicher[size] = c;
        free(tmp);
    }
    //Nun zur Ausgabe
    for(size_t i = size;i>0;i--)
    {
        printf("%c",speicher[i]);
    }
    printf("\n");
    free(speicher);
    return 0;
}

Lg Wolfi
 
Zuletzt bearbeitet:
Hallo ! Ich hab da mal eine Frage wo wird denn hier überprüft wann der Speicher voll ist und erweitert werden muss ?! Fehlt da nicht eine if ?
Nein, der Speicher ist immer "voll".

Es wird in jedem Schleifendurchlauf realloc aufgerufen, d.h. der Speicher wird jedes Mal genau um 1 Byte erweitert. (was an sich relativ ineffizient ist)

Wie schon festgestellt wurde, ist der Codeteil mit dem memcpy ziemlich sinnfrei.
 
Dein Code ist nicht vollständig. Wie sieht der Rest aus?
Und du reallokierst den Speicher nur einmal.
Sollte das nicht
C:
size % BLOCK_SIZE == 0
heissen?

Gruss
cwriter
 
Hallo liebe Leute

könnte mir bitte irgendjemand helfen und sagen wo mein Fehler liegt das mein speicher nur einmal erweitert wird?

Code:
int main(int argc, char* argv[])
{
  
  char* temp_array = NULL;
  unsigned int len = 0;
  unsigned int size = 0;
  unsigned int i;
  char c = 0;

  temp_array = (char*)malloc(BLOCK_SIZE);

  if(temp_array == NULL)
  {
    printf("Error: Out of memory!\n");
    return 1;
  }

  while((c = fgetc(stdin)) != EOF)
  {
    len++;
		
    if(len == BLOCK_SIZE)
    {
      size = BLOCK_SIZE + len;
      temp_array = (char*)realloc(temp_array,size);

      if(temp_array == NULL)
      {
        printf("Error: Out of memory!\n");
        return 1;
      }
    }
    printf("%d SPEICHER\n", size);
    temp_array[len-1] = c;
  }
 
Da len ja stetig wächst, kann es nur ein Mal gleich BLOCK_SIZE sein.

Edit: P.S. feof() gibt int zurück, EOF ist ein int.
 
Zuletzt bearbeitet:
Du müßtest dir die aktuelle Größe des Speichers und den Füllstand des Speichers (len) merken.

Immer wenn der Speicher erschöpft ist (Füllstand >= Größe), müßtest du den Speicher (um Blockgröße) vergrößern und die neue Größe speichern.
 
Zurück