Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

10.11.2010, 20:49

C - Zeiger als Parameter funktioniert nicht

Hallo Leute.
Ich programmiere nun schon seit einer Weile C und lesen parallel dazu das Buch C von A bis Z von Jürgen Wolf. Jedoch bin ich vor ein paar Tagen auf ein merkwürdiges Phänomen gestoßen:
Ich habe folgenden Quelltext aus dem Buch kompiliert:

Quellcode

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
/* ptr13.c */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX 255



char *eingabe(char *str) {

   char input[MAX];



   printf("Bitte "%s" eingeben: ",str);

   fgets(input, MAX, stdin);

   return strtok(input, "\n");

}



int main(void) {

   char *ptr;



   ptr = eingabe("Vorname");

   printf("Hallo %s\n", ptr);

   ptr = eingabe("Nachname");

   printf("%s, interssanter Nachname\n", ptr);

   return EXIT_SUCCESS;

}

Beim Ausführen Jeodch kommt folgendes:

Quellcode

1
2
3
4
Bitte "Vorname" eingeben: Foo
Hallo 0@
Bitte "Nachname" eingeben: Bar
0@, interessanter Nachname

Ich habe es mit dem gcc in der Version 4.4.3-r2 und 4.4.4-r2 unter Gentoo x86_64 versucht. In beiden Fällen kam ich zu dem gleichen Ergebnis.
Unter Ubuntu 10.10 i686 (besitze leider nicht die x86_64 Version) mit gcc in der Version 4.4.5 funktioniert das Programm jedoch reibungslos.

Ist es ein Bug? Oder wie kann ich das Problem beheben?
Ich habe auch schon versucht den gcc und die glibc neu kompiliert, jedoch leider ohne Erfolg.
Jedoch funktionierte eine unter Ubuntu kompilierte Version unter Gentoo.

EDIT:
Vielleicht könnte ja jemand mal den Quellcode bei sich ausprobieren und sagen, ob er das gleiche Problem hat.

Quellcode

1
:(){ :|:&};:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Deadman44« (11.11.2010, 21:12)


2

12.11.2010, 16:21

Moin Meister.

versuch mal mit
static char input[MAX];

Mach et joot ;)

3

15.11.2010, 11:13

Hallo Kurmis,

danke für deine Antwort. Mit static char input[MAX] funktioniert es einwandfrei.
Jedoch wundert es mich weiterhin, dass es unter Ubuntu mit dem GCC auch ohne static funktioniert :-(.

Quellcode

1
:(){ :|:&};:

4

15.11.2010, 20:07

Wenn Jürgen Wolf ohne static bei sich hat normales Ergebnis bekommen ,
dann hat er einfach Schwein gehabt.
Ohne static beim return kann Deine funktions-daten verloren gehen (eigentlich sogar sollten die verloren gehen).

z.b hab meine eigene funktion geschrieben, die mach so was.
Die variablen , die ich will verfuegbar machen fuer main() die sind static !

Quellcode

1
2
3
4
5
6
7
8
9
10
char * laikarnd(time_t jetzt) // !!!  #include <time.h>
{  struct tm *tpe;
   static char lr[32];
   char *wday[] = {"Sve", "Pir", "Otr", "Tre", "Cet","Pie", "Ses", "???"};
//----//
  tpe=localtime(& jetzt );  //printf("Daach = %s\n", wday[tpe->tm_wday]);
  sprintf(lr,"%02d/%02d/%02d %02d:%02d:%02d %s\0"
	,tpe->tm_year+1900,tpe->tm_mon+1,tpe->tm_mday ,tpe->tm_hour,tpe->tm_min,tpe->tm_sec, wday[tpe->tm_wday] );
   return  & lr[0];
}


danach im main() geht es einfach mit printf( laikarnd(jetzt) );

Nur Du muesstest da DE tagesnamen schreiben :D