Thread Probleme mit strcat (20 answers)
Opened by renee at 2005-04-28 14:28

murphy
 2005-04-29 16:29
#11125 #11125
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn man sich als verwöhnter Perl Programmierer an C wagt, macht es sich vielleicht auch nicht schlecht, zur Speicherverwaltung einen Garbage Collector zu benutzen (z.B. den klassischen Boehm-Demers-Weiser conservative garbage collector). In aller Regel bringt das keine Performancenachteile, manchmal sogar Vorteile, je nach Allokationsschema.

Hier ein kleines Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <gc/gc.h>
#include <setjmp.h>
#include <string.h>
#include <stdio.h>

jmp_buf exception_handler;

// Praktische Makros für die Speicherreservierung
#define GC_NEW_ARRAY(type, dim) \
(type *)GC_MALLOC((dim) * sizeof(type))
#define GC_NEW_ATOMIC_ARRAY(type, dim) \
(type *)GC_MALLOC_ATOMIC((dim) * sizeof(type))
#define GC_RESIZE_ARRAY(array, type, dim) \
(array) = (type *)GC_REALLOC((array), (dim) * sizeof(type))

// "Idiotensichere" Stringverkettung
char *gc_strcat(char *dest, char *src) {
if (dest)
GC_RESIZE_ARRAY(dest, char, strlen(dest) + strlen(src) + 1);
else
dest = GC_NEW_ATOMIC_ARRAY(char, strlen(src) + 1);

if (!dest)
longjmp(exception_handler, 1);

return strcat(dest, src);
}

// Testprogramm
int main(void) {
// Exception handler installieren
if (setjmp(exception_handler)) {
fputs("Out of memory!\n", stderr);
return 1;
}

// Standardeingabe zeilenweise auslesen und verketten
char *buf = NULL;
char line[1024];

while (!feof(stdin)) {
if (fgets(line, 1023, stdin))
buf = gc_strcat(buf, line);
}

// Alles wieder ausgeben
puts(buf);

// Um das Freigeben des Speichers brauchen wir uns nicht
// weiter zu kümmern.
return 0;
}


(edit: Beispiel eingefügt)\n\n

<!--EDIT|murphy|1114779453-->
When C++ is your hammer, every problem looks like your thumb.

View full thread Probleme mit strcat