Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » malloc char?

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
06.08.2003, 23:42 Uhr
BeS



Hi,
ich bin gerade am verzweifeln...
Wie kann ich Speicher für einen string von z.B. 10 Zeichen anfordern?
Das alles habe ich jetzt schon probiert:
string=(char *)malloc(sizeof(char)*11);
string=(char *)malloc(11);
string=malloc(sizeof(char)*11);
string=malloc(11);

nichts funktioniert, es werden nur immer 3Zeichen eingelesen...
Wenn ich am Anfang nicht (char *) angebe bekomme ich sogar eine Fehlermeldung beim compilieren, obwohl ich jetzt schon oft gelesen habe das man es weg lassen soll...
Warum habe ich aber nicht so richtig verstanden und mein Verständnis von malloc war bisher auch immer das ich vorne den typ angeben muß.

Kann mir mal jemand auf die Sprünge helfen?

Danke!
--
If art interprets our dreams, the computer execute them in the guise of programs!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.08.2003, 01:04 Uhr
kronos
Quotenfisch
(Operator)


genau kann ich dir's nicht sagen, da ich nur C schreibe, aber die stringklasse von C++ erledtig das memory-management afaik automatisch.
falls das C sein sollte, müsste die erste lösung funktionieren, sofern string ein char-pointer ist.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.08.2003, 02:24 Uhr
BeS



Hallo,
ja, das soll C sein.
string ist so deklariert:
char *string;

Die zweite Methode müsste imho auch funktionieren, da sizeof(char) 1
sein müsste, also kann man auch gleich 11 Schreiben...
Aber beide funktioniern komischerweise nicht, es werden immer nur die
ersten drei Zeichen eingelesen.
Oder liegt es an der Art wie ich es einlese?
fgets(string, sizeof(string), stdin);
--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 07.08.2003 um 02:26 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.08.2003, 02:50 Uhr
kronos
Quotenfisch
(Operator)



Zitat:
BeS postete
Oder liegt es an der Art wie ich es einlese?
fgets(string, sizeof(string), stdin);


du sagst es
sting ist ein pointer, also im grunde ein integer der eine speicheraddresse beherbergt (an dieser speicher addresse sollte dein eigentlicher string beginnen). da ein int in der regel vier byte hat, ist sizeof(string)=4. darum werden nur 3 zeichen eingelesen (eins für 0-char!).
für input kannst du auch scanf verwenden, also z.B.

C++:
char *string;
scanf("%s", string);


--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.08.2003, 02:56 Uhr
Pablo
Supertux
(Operator)


Ich verstehe nicht, wozu du malloc benutzt. Willst du eine Zeile einlesen? Dann geht das einfacher.


C++:
char zeile[255];
scanf("%s", zeile);


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.08.2003, 09:31 Uhr
ao

(Operator)


@Pablo: Es gibt schon gute Gründe für malloc.

@BeS: Das mit den 3 Zeichen hat kronos ja schon erklärt. Eine Alternative zu scanf ist

C++:
#define STRING_SIZE 11
fgets (string, STRING_SIZE, stdin);


wobei die symbolische Konstante deshalb ratsam ist, weil sie es erleichtert, die Stringgröße später zu ändern. Tastaturabfragen mit scanf sind leider völlig ungeschützt; wenn es dem Benutzer einfällt, mehr als 255 Zeichen einzutippen, kann das Programm abstürzen. fgets ist da schon sicherer.

Ob malloc oder char zeile [255] besser ist, kommt auf den Zusammenhang an. Zeig doch mal ein bisschen mehr Code, dann kann man das besser erkennen.Was wird mit den eingelesenen Zeichen angefangen?

Die malloc-Statements oben sind alle richtig.

sizeof (char) kann man weglassen, das ist immer 1.

Was die Fehlermeldungen angeht: Wie lauten sie genau? Und wird der Code als C oder als C++ übersetzt (das richtet sich üblicherweise nach der File-Extension: .c bedeutet C, andere Extensions, z.B. .cpp, .cxx, .cc, deuten auf C++ hin)?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.08.2003, 11:10 Uhr
BeS



Hallo,
danke euch allen!
Ein konkretes Programm gibt es nicht, ich experimentiere gerade nur etwas mit kleinen "Testprogrammen" rum.
Zu den Verschiedenen Methoden mit malloc.
Wenn der Rückgabewert von malloc nicht mit (char *) ge-castet wird, dann bekomme ich diese Fehlermeldung:
test.c: In function `main':
test.c:26: warning: assignment makes pointer from integer without a cast

(in Zeile 26 steht der malloc Befehl so drin: test=malloc(STRING_SIZE); )

PS: mit dem STRING_SIZE ist mir noch eine Frage eingefallen.
Wann nimmt man bei Konstanten eigentlich
#define STRING_SIZE 11;
und wann
const int STRING_SIZE=11;

das habe ich mir bisher auch noch nie so richtig erklären können?
Ich weiß, das bei #define vor dem compilieren STRING_SIZE durch 11 ersetzt wird, man die const STRING_SIZE also z.B. nicht in einem debugger sehen kann. Während bei cosnt wirklich die Konstante wie eine Variable stehen bleibt. Aber wann sollte man was benutzen?

Danke!
--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 07.08.2003 um 11:14 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.08.2003, 12:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Die Warnung beim malloc kommt, weil Du nicht den Header stdlib.h includiert hast.

Was die alternative zwischen #define und const int angeht:
Für die const int Variante spricht vor allem die Typsicherheit: Du definierst dann mit STRING_SIZE nicht einfach nur einen Wert, sondern vor allem einen typisierten Wert. Solange Du sich in C++ Gefilden aufhälts, ist diese variante die erste wahl.
In C Sieht die Welt anders aus. Da ist zunächst mal folgendes:

C++:
const int STRING_SIZE = 11;
char buffer[STRING_SIZE];


geht erst ab dem C99 standard. Denn obwohl STRING_SIZE Konstant ist, ist es eine Variable aus Sicht des Compilers und Arrays mit Variablenlänge sind nicht erlaubt. Aber selbst im C99 Standard spricht noch manches für die #define Variant, nämlich wenn Du in C programmmierst und gleichzeitig mit mehreren C Dateien hantierst. Folgender Code würde sich nämlich nicht in C übersetzen lassen, sondern nur in C++:

C++:
/* header.h */
#ifndef HEADER_H_INCLUDED_
#define HEADER_H_INCLUDED_

const int STRING_SIZE = 11;

extern void f();
#endif


Dann die Implementation von f:

C++:
/* f.c */
#include "header.h"

void f()
{
   /* Hier wird Stringsize benutzt */
}


sowie das hauptprogram:

C++:
#include "header.h"

int main()
{
   f();
}


Das ganze Programm besteht also aus den Dateien f.c und main.c. In C würde sich das nicht übersetzen lassen, weil zweimal der STRING_SIZE als Symbol vorkommen würde. Würde man im Header nun an Stelle des const int ein #define verwenden, würde es funktionieren. Alternativ ginge auch:

1. Im header STRING_SIZE als extern deklarieren und in f.c denn Die Konstante definieren:

C++:
/* Im header: */
extern const int STRING_SIZE;
/* In f.c */
const int STRING_SIZE = 11;


Dann kann man aber dummerweise keine Arrays deklarieren (in <C99), weil der Wert von STRING_SIZE unbekannt ist.
2. Im Header vor dem const noch ein static Spendieren:

C++:
static const int STRING_SIZE = 11;


ist aber auch nicht so toll, weil man dann damit ganz viele redendante STRING_SIZE instanzen bekommt. Ausserdem ist das ziemlicher mieser Stil, Variable (wie static auch immer) in einem header zu definieren.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.08.2003, 12:17 Uhr
0xdeadbeef
Gott
(Operator)


stdlib.h wird schon includet sein, sonst käme die Fehlermeldung auch, wenn er (char*) davor schreibt. Ich vermute, dass der Compiler auch keinen Fehler, sondern eine Warnung rausschmeißt - das muss er zwar eigentlich nicht, aber manche Compiler machen es trotzdem.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.08.2003, 12:43 Uhr
ao

(Operator)



Zitat:
0xdeadbeef postete
stdlib.h wird schon includet sein, sonst käme die Fehlermeldung auch, wenn er (char*) davor schreibt. Ich vermute, dass der Compiler auch keinen Fehler, sondern eine Warnung rausschmeißt - das muss er zwar eigentlich nicht, aber manche Compiler machen es trotzdem.


Nein, genau diese Warnung ("... makes pointer from integer without cast") wird durch den expliziten Cast unterdrückt. Und dass es eine Warnung und kein Fehler ist, hat BeS in seinem (bislang) letzten Posting geschrieben bzw. zitiert.

@BeS: Das Ganze soll nicht heißen, daß der (char *)-Cast dein Problem löst, im Gegenteil, er verschleiert es. Die Lösung ist, in deinem Programm den Prototyp von malloc bekanntzumachen, und zwar durch

C++:
#include <stdlib.h>



In C gilt die Regel: Keine unnötigen expliziten Casts, und Casts von void* auf andere Zeigertypen und zurück sind immer unnötig, weil sie implizit vom Compiler gemacht werden.

In C++ ist es anders: Hier musst du explizit casten, weil der Compiler es implizit nicht macht.

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: