verkehrte string und speicherverwaltung

Problem 1:
Hast du die vier oben festgestellten Fehler schon gesehen bzw. bei dir ausgebessert?

P2: Was bedeutet das genau?
Tastatureingabe oder Datei mit < ?

P3+4: Wie/womit kompilierst du? (Compileraufrufszeile am Besten)
Hast du stdlib.h und string.h inkludiert?
 
jap hab ich schon ausgebessert!

tastatureingabe! keine datei

ich kompiliere mit dem terminal! also aufruf: gcc -Wall -o hw5 hw5.c
string.h hab ich nicht inkludiert. aber wir dürfen das auch nicht; leider gottes!
 
Zum Abbrechen:
Ist das nicht so gedacht?
Es sollen von der Konsole (stdin) Zeichen eingelesen werden, bis das Ende des Eingabestreams (EOF) erreicht ist. Beim Testen kann man den Stream mit dem Tastenkürzel Strg+D (in Windows Strg+Z) beenden...

size_t. Hm...naja, wenns nicht bekannt ist, nimm einfach unsigned int.
Ist prinzipiell nichts Anderes.

memcpy: Wenn die Headerdatei nicht inkludiert werden darf. kann man das so nicht verwenden
(bzw. man könnte den entprechenden Teil selbst definieren,
aber das wird nicht im Sinn vom Lehrer sein.)
Was ein memcpy(a,b,c) tut ist einfach nur c Bytes vom Array b in Array a zu kopieren.
Wenn man ein unbenütztes int i hat und a und b char-Arrays sind (wie bei diesem Code eben),
einfach ersetzen mit:
C:
for(i = 0; i < c; i++)
    a[i] = b[i];
 
Zu Punkt 3:
Ersetze size_t durch unsigned int.

Gruss
cwriter

Edit: Ach Menno, sheel war schneller :-)

EDIT 2: Nach cplusplus.com KANN realloc den Speicherblock in den neuen kopieren. In dem Falle brauchst du auch das memcpy nicht.
 
Zuletzt bearbeitet:
@Heinzi1991

Hallo,

ich habe ein ähnliches Problem. Magst du vielleicht deinen Code posten damit ich sehen kann was du nun gemacht hast? Du hast erwähnt das du dies vll tust :)

"werde jetzt einmal deine lösung checken wegen den angeblichen leaks und so und werde bescheid geben wenn alles passt oder eine fehelerkorrektur durchführen und dann in fehlerlosen code posten!"

lg
 
Zum Abbrechen:
Ist das nicht so gedacht?


size_t. Hm...naja, wenns nicht bekannt ist, nimm einfach unsigned int.
Ist prinzipiell nichts Anderes.

memcpy: Wenn die Headerdatei nicht inkludiert werden darf. kann man das so nicht verwenden
(bzw. man könnte den entprechenden Teil selbst definieren,
aber das wird nicht im Sinn vom Lehrer sein.)
Was ein memcpy(a,b,c) tut ist einfach nur c Bytes vom Array b in Array a zu kopieren.
Wenn man ein unbenütztes int i hat und a und b char-Arrays sind (wie bei diesem Code eben),
einfach ersetzen mit:
C:
for(i = 0; i < c; i++)
    a[i] = b[i];

Ich verstehe das mit dem ändern des memcpy nicht.
Könntest du das bitte anhand dieses Programms einmal für mich machen.

Danke
 
Was genau verstehst du denn nicht?

memcpy macht nichts anderes, als Werte von einem Array in ein anderes zu kopieren.
Die drei Parameter, die die Funktion bekommt sind:
1: Das Zielarray (das mit Werten vom anderen gefüllt wird)
2: Das Quellarray (aus dem wird eben gelesen, es selbst wird nicht verändert)
3: Wie viele Byte kopiert werden sollen.
Einfach eine Zahl, oder eine int-Variabale mit dem Wert drin.
Achtung: Wieviel Byte, nicht wieviel Arrayelemente.
Wenn man drei char von einem char-Array kopieren will ist es also 3.
Für das Kopieren von 3 float aus einem float-Array wäre es 12 (weil ein float 4 Byte braucht)

Wenn man nur den Fall char-Array hernimmt kann man das Kopieren mit einer ganz einfachen Schleife auch machen.
Folgender Code mit memcpy:
C++:
char array1[100];
char array2[100];
...
//irgendwas in array1 reinspeichern
...
memcpy(array2, array1, 100); //das komplette array1 in array2 kopieren
kann auch so geschrieben werden:
C++:
char array1[100];
char array2[100];
...
//irgendwas in array1 reinspeichern
...
int zaehler; //Man braucht etwas für die Schleife zum durchzählen

for(zaehler = 0; zaehler < 100; zaehler++)
    array2[zaehler] = array1[zaehler];
 
Hey =)

kann man dies auch ohne memcpy machen?
wenn man ein Array mit realloc() vergrößert wird doch der alte Inhalt mitkopiert.

mal angenommen wir befüllen ein Array_1, sobald dieses "voll" ist, erweitern wir mit realloc(). sagen wir das Array_1 zu Beginn Platz für 64 Byte hatte.

Code:
Array_tmp = realloc(Array_1,(sizeof(char) *128)); // Array_tmp hat nun Inhalt von Array_1 und hat insgesamt 128 Byte (wobei 64  
                                                  // Byte schon initialisiert sind)

Nun bin ich mir nicht sicher , wenn ich den Pointer von Array_tmp dem Array_1 übergebe, ob der Inhalt der davor initialisierten Bytes erhalten bleibt .

Also wenn ich schreiben würde:

Code:
Array_1 = Array_tmp;  //kopiert pointer von Array_tmp zu Array_1
free(tmp);
tmp=NULL;

Bzw. darf man dies überhaupt so machen ? :D

Mfg
 
kann man dies auch ohne memcpy machen?
wenn man ein Array mit realloc() vergrößert wird doch der alte Inhalt mitkopiert.
Meistens schon. Die Definition garantiert das aber nicht.
Nun bin ich mir nicht sicher , wenn ich den Pointer von Array_tmp dem Array_1 übergebe, ob der Inhalt der davor initialisierten Bytes erhalten bleibt .
Der Speicher bleibt reserviert, ja.
Bzw. darf man dies überhaupt so machen ?
Ich weiss nicht, was bei dir "tmp" ist. Die erste Zeile deines Codes sollte reichen.

Gruss
cwriter
 
Zurück