"We are back" « oc.at

[C] warning: ISO C90 does not support ...

lama007 24.02.2009 - 15:31 5194 21 Thread rating
Posts

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
Wenn ich sowas mache, bekomme ich eine schöne Fehlermeldung und das Programm bricht ab:

Code:
#include <stdio.h> 
#include <stdlib.h>   

int main( void ) { 	
  char *ptr = "Hello, World!"; 	
  printf( "%s\n", ptr ); 	
  free( ptr );  	

  printf( "Test, Test\n" ); 	
  return 0; 
}

Und das schaut auch gut aus:

Code:
#include <stdio.h> 
#include <stdlib.h>   

int main( void ) { 	
  char *ptr; 	
  printf( "Hello, World!\n" ); 	 	

  if ( ptr ) { 		
    printf( "free!!!\n" ); 		
    free( ptr ); 	
  }  	

  printf( "Test, Test\n" );  	
  return 0; 
}

Ist "if ( ptr ) { free( ptr ) };" ein Schutz vor falschem "free()"?

Blair

Big d00d
Avatar
Registered: Dec 2004
Location: Graz
Posts: 177
wenn du ptr nicht auf NULL setzt, bringt dir die abfrage garnix. free auf einen pointer auf einen speicherbereich im stack auszuführen endet wie schon öfter erwähnt in undefiniertem verhalten, was nicht gerade toll ist.

lies dir mal die literatur zu stack, heap und pointer durch ...

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
Zitat von Blair
Zitat von Starsky
hoffen wir´s. trotz aller bugs ist tdu für mich vom konzept und der umsetzung her einer der geilsten racer überhaupt - bis eben auf die bugs, die leider fast alles an einem genialen spiel kaputt gemacht haben.
aber die rennen mit Friedel und bodo waren einfach geil!

Zu meiner Verteidigung: ich hatte Gedanken in diese Richtung, weiß aber nicht mehr genau, wieso ich es nicht gemacht habe.
Warum werden Zeiger nicht automatisch mit NULL initialisiert?

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
Zitat von watchout
Das ganze lässt sich oft recht leicht anstellen - initialisierst du zb. so einen Pointer mit NULL kannst du recht sicher davon ausgehen dass du gefahrlos free() aufrufen kannst, weil der Pointer ja dann entweder NULL ist oder auf einen passenden Speicherbereich zeigt.

Wenn ich keinen Fehlermeldung will, braucht es dazu noch eine if ( zeiger ) - Abrfrage.

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11346
Zitat von lama007
Warum werden Zeiger nicht automatisch mit NULL initialisiert?

Weil Variablen in C nie automatisch initialisiert werden.

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11346
Zitat von lama007
Wenn ich keinen Fehlermeldung will, braucht es dazu noch eine if ( zeiger ) - Abrfrage.

if (p) free(p) bringt überhaupt nichts, es macht nur das Programm etwas langsamer und größer.

Lies nochmal den Quote von Watchout:

Zitat
free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.

lama007

OC Addicted
Avatar
Registered: Mar 2002
Location: Austria
Posts: 851
Das getline-Manual ist schuld :cool: .
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz