Archiv verlassen und diese Seite im Standarddesign anzeigen : C - malloc() problem
Ich hab ein ganz einfaches Problem aber leider über die Suche keine passende Lösung gefunden.
typedef struct{
float x,y;} point;
...
main()
point *p;
...
blabla scanf("%lu"numpoints)
...
p = malloc ( (numpoints+1)*sizeof(point) );
in der Zeile mit malloc erhalte ich folgende Warnung:
[Warning] assignment makes pointer from integer without a cast
Was muss ich tun ? :>
danke schonmal und sry für die sicherlich triviale Frage ^^
peschmae
27-01-2006, 01:28
Ich weiss nicht genau wo die Fehlermeldung herkommt, aber zwei Sachen:
- ich weiss ja nicht ob es so schlau ist direkt vom User abzufragen wieviel Speicher du belegen sollst und das dann einfach zu machen
- malloc gibt einen void* zurück - den musst du casten nach dem richtigen Typen. Ich denke die Fehlermeldung könnte sich darauf beziehen:
p = (point*)malloc ( (numpoints+1)*sizeof(point) );
MfG Peschmä
danke genau das wars schon :)
dynmaischer speicher nach userangabe...?
wow..
da wird man ja direkt zu nem buffer owerflow gezwungen.. :D
naja ... das Programm erfordert das ... das Feld soll eine beliebige anzahl punkte fassen können ... und ich fang das ja ab falls nciht genug speicher da ist ;)
naja ... das Programm erfordert das ... das Feld soll eine beliebige anzahl punkte fassen können
Nee tut es nicht ^^
Mann muss daten nicht zwangslaeufig immer in Arrays halten ...
Schon mal was von verketteten Listen gehoert ?
Ausserdem waer bin ich nen arg verowehnter User im zweifelsfall. wenn ich daten eingebe und ich muss vorher festlegen wieviel es werden sollen, juckts mir schon in den fingern und ich wuerd gern schelte verteilen. Ich wil sagen wenn ich fertig bin, und dann basta ^^
Wenn der User 123846384532 Strukturen anlegen will, soll er es auch tun, aber dann auch fuer alle die daten per hand eingeben ^^
und auf pladde auslagern kann man auch immer noch, wenn der platz ned langt ^^
Stell dir vor das teil laeuft aufm rechner mit 256MB RAM, und der user gibt die daten ned per hand ein sondern laesst die sich durch nen script erzeugen (mittles pipe usw) Pinguin Benutzer machen solche Sauerein ^^
Ich hoffe mal das war jetzt kein Thema aus irgend ner Hausaufgabe, da stelln die immer solch komische Anforderungen und der Programmierer kann nix gegen machen ^^
Ciao ...
peschmae
31-01-2006, 09:53
Ich mag verkettete Listen nicht, nur für den dens interessiert. Ich meine der Verwaltungsaufwand (Speicher und so) ist zu hoch in den meisten Fällen im Vergleich zu einer Lösung mit Array(s).
Und Laufzeitmässig bringts eh nur was wenn du andauernd Elemente einfügst und entfernst. Naja, ok, manchmal mag das der Fall sein :D
MfG Peschmä
den verwaltungsaufwand nehm ich aber gern in kauf ^^
und der is trivial im gegensatz dazu
-wenn du dein array staendig erweitern musst.
-oder immer speicher auf verdacht allokieren musst, da vorraus ahnen musst, was der user noch so tun koennte
- man mit festen groessen meist zu unflexiebel ist
Nen Guter SW entwickler sollt die anforderungen analysieren und anhand der entstehenden Vor und Nachteile entscheiden, was besser ist ^^
Ich wuerd auch lieber Arrays nehmen als unter C verkettete listen nachzuprogrammieren, oder noch lieber auf c++ umsteigen
Ciao ...
peschmae
31-01-2006, 16:36
Okok, wir nehmen C++ da geht das mit Vektor recht von selber :)
Ich geb ja zu dass der Verwaltungsaufwand mit Arrays in C genau so wenig Spass macht ;)
(Wenn man da oft was ändern muss natürlich immer.)
MfG Peschmä
Das war übrigens eine Warnung und kein Fehler. Das Programm wurde trotzdem kompiliert.
peschmae
01-02-2006, 06:22
Heisst trotzdem nicht dass man das ignorieren darf wenn das kompiliert. q.e.d. ;)
MfG Peschmä
guardian
01-02-2006, 07:20
[...]
- malloc gibt einen void* zurück - den musst du casten nach dem richtigen Typen. Ich denke die Fehlermeldung könnte sich darauf beziehen:
p = (point*)malloc ( (numpoints+1)*sizeof(point) ); [...]
Wieso den Rückgabewert casten ? Kann zwar vom Compiler implizit gecastet werden, allerdings kann es da zu Problemen kommen. Wenn man malloc verwendet, _muss_ die stdlib-Header eingebunden werden.
Ist das nicht der Fall, kommt es zu der Warnung. Logisch das man dann durch das Casten die Warnung wegbekommt, allerdings wird malloc dann auch anders deklariert (da kein/e PrototypFunktionsdefinition mehr vorhanden ist):
extern int malloc(); /* also int als Rückgabetyp */
Und wenn jetzt das Programm auf einer anderen Plattform zum Laufen gebracht werden soll, wo folgendes der Fall ist:
if( sizeof( int ) != sizeof( void* ) )
printf( "Huhu alles hin oder !?" );
Dementsprechend funktioniert (mit 99,9%iger Sicherheit bei jedem ANSI-/ISO-kompatiblem Compiler *g*) das hier ohne weiteres:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
float x;
float y;
} point;
/* ... */
if( ( p = malloc( ( numpoints + 1 ) * sizeof( point ) ) ) == NULL )
{
fprintf( stderr, "(p = malloc) error!\n" );
free( p );
return EXIT_FAILURE;
}
else
{
printf( "OK" );
/* ... */
}
/*...*/
Bitte korrigiert mich wenn ich falsch liege :)
MfG
peschmae
01-02-2006, 15:12
Stimmt, da ist das fehlende Header der Fehler, nicht der fehlende Cast. Den Cast brauchts nämlich eh nur in C++ und nicht in C (und auch dort gibts "nur" ne Warnung zumindest bei GCC).
MfG Peschmä
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.