Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Habe ein Problem mit pointer to void und malloc

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
27.04.2004, 14:16 Uhr
NoradX



Hi,

ich habe ein Programm, in dem folgendes vorkommt:



C++:
#include <stdlib.h>
void main( void )
{
   unsigned int         *ptr_counter;

   ptr_counter = malloc( sizeof (unsigned int) );  
}



Der Kompiler meldet:

error C2440: '=' : 'void *' kann nicht in 'unsigned int *' konvertiert werden
Konvertierung von 'void*' in Zeiger auf nicht-'void' erfordert eine explizite Typumwandlung


Soweit ich weiß hat ein Pointer to void keinen Typ. Warum also konvertieren? Das habe ich zwar auch versucht, aber hat nicht geholfen.

Vielen Dank im Voraus!

Dieser Post wurde am 27.04.2004 um 14:55 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.04.2004, 14:25 Uhr
typecast
aka loddab
(Operator)



C++:
prt_counter = (int*) malloc(sizeof(unsigned int));



Malloc stellt dir einfach rohen Speicher zur Verfügung. Damit der Kompiler weiß, welchen Typ er in diesem Block zu erwarten hat, musst du ihm das mit dem typecast sagen.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.04.2004, 14:27 Uhr
(un)wissender
Niveauwart


Da Pablo nicht hier ist:
void main gibt es nicht!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.04.2004, 14:53 Uhr
Pablo
Supertux
(Operator)



bravo, vielen Dank für die Mitarbeit
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.04.2004, 15:07 Uhr
NoradX



Wie "void main" gibt es nicht?
Das habe ich aus einem offiziellen Microsoft Beispiel:

C++:
/* MALLOC.C: This program allocates memory with
* malloc, then frees the memory with free.
*/


#include <stdlib.h>         /* For _MAX_PATH definition */
#include <stdio.h>
#include <malloc.h>

void main( void )
{
   char *string;

   /* Allocate space for a path name */
   string = malloc( _MAX_PATH );
   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}


Im Übrigen, dieses Beispiel konnte ich auch nicht kompilieren.

Was muss ich stattdessen machen?

C++:
int main (void)
{
     return 0;
}



Woran liegt das? ANSI-Standard?
Wo kann ich den aktuellen Standard nachlesen?

Dieser Post wurde am 27.04.2004 um 15:12 Uhr von NoradX editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.04.2004, 15:13 Uhr
0xdeadbeef
Gott
(Operator)


main ist per Standard immer int. Das hat den Grund, dass die umgebende Shell einen Rückgabewert erwartet, um z.B. in Skripten eventuell auftretende Fehler behandeln zu können. void main kann dazu führen, dass die umgebende Shell einen Rückgabewert ausliest, wo keiner ist, und so einen segfault verursacht (wobei das nur noch bei ziemlich alten Systemen passiert. Es kann aber sein, dass ein Skript deswegen abbricht oder du irgendwelche ganz merkwürdigen Rückgaben kriegst).

Dass du sowas in der MSDN findest, wundert mich nicht wirklich - Mickeysoft hat nie wirklich auf Scriptability geachtet, und auf Standards noch weniger. Ein wirklich standardkonformer Compiler jedenfalls müsste solchen Code ablehnen oder zumindest ne Warnung rausschmeißen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.04.2004, 15:47 Uhr
ao

(Operator)



Zitat:
NoradX postete

C++:
#include <stdlib.h>
void main( void )
{
   unsigned int         *ptr_counter;

   ptr_counter = malloc( sizeof (unsigned int) );  
}



error C2440: '=' : 'void *' kann nicht in 'unsigned int *' konvertiert werden
Konvertierung von 'void*' in Zeiger auf nicht-'void' erfordert eine explizite Typumwandlung


In C ist die Zuweisung ohne Typecast in Ordnung (alle Zeigertypen sind implizit in void* und zurück castbar). In C++ geht das nicht, da ist ein expliziter Cast erforderlich. Aber in C++ nimmt man sowieso besser new als malloc.

Obiger Quelltext ist (vom void main mal abgesehen) C.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.04.2004, 16:13 Uhr
NoradX



Danke an alle!

@0xdeadbeef

Das lustige dabei ist ja, dass ein Microdoof-Compiler mir den Code ablehnt.

Naja ich steige momentan sowieso auf GNU/Linux um.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.04.2004, 16:22 Uhr
(un)wissender
Niveauwart


Du auf der MSDN zu findenden Beispiele sind meistens sehr alt und grausam programmiert, oft sogar falsch und mit heutigen Compilern nicht compilierbar, als keine Referenz.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.04.2004, 16:28 Uhr
ao

(Operator)



Zitat:
NoradX postete
Das lustige dabei ist ja, dass ein Microdoof-Compiler mir den Code ablehnt.

Aber nicht wegen dem void main, sondern wegen dem Typecast, und da steigt jeder C++-Compiler aus. Übersetz das mal als C-Sourcecode, dann gehts.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: