• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Blödes C Problem

Geigaman

Macoun
Registriert
17.03.06
Beiträge
116
Ok, wie der Titel schon sagt habe ich ein echt blödes Problem:
Ich muss im Rahmen meines Studiums C programmieren (eig. unter Unix/Linux, aber mein Rechner ist gerade kaputt, deswegen nun auf dem iBook).
Also ich schreibe den Code mit SubEthaEdit und führe dann im Terminal gcc aus.
Ich habe den Fehler schon recht weit eingegrenzt:
Code:
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[]){
char *str;
printf("Eingabe:\n");
scanf("%s", str);
printf("%s\n", str);
}

Der Fehler liegt bei diesem scanf:
schreibe ich scanf("%s", s) bekomme ich "Bus error" wenn ich etwas eingebe
schreibe ich scanf("%s", &s) so bekomme ich "Segmentation fault".

Eins von den Beiden müsst es doch sein, oder? Unter Linux habe ich es auch mit etwas auprobieren immer hinbekommen.

Danke
Sebastian
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
Geigaman schrieb:
Ok, wie der Titel schon sagt habe ich ein echt blödes Problem:

Code:
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[]){
char *str;
printf("Eingabe:\n");
scanf("%s", str);
printf("%s\n", str);
}

In diesem Fall ist str ein char-Pointer, der auf NIL, statt einen Speicherbereich zeigt.

mfg pi26
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Dein str ist ein Pointer, der ins Nirvana zeigt. Versuch mal das (nicht ausprobiert, deshalb ohne Gewaehr):

char str[80];
scanf("%s", str);
 

Geigaman

Macoun
Registriert
17.03.06
Beiträge
116
Danke für die Antworten. Ich weiß, dass es mit einem Array geht, allerdings haben wir so ein <ironier>tolles</ironie> Skript, das diese Möglichkeit komplett aussenvor lässt. Wenn ich jetzt mit Arrays anfange, dann kommt erstens mein <ironie>supermotivierter</ironie> Betreuer und schnauzt mich an und zweitens verwende ich im Rest des Programmes auch nur Pointer. Geht das nicht irgendwie mit Pointern ?
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Dein Problem ist halt, dass Du Deinem Zeiger nie Speicherplatz zuweist. Wenn Du dringend einen Zeiger brauchst, dann liesse sich mein Beispiel so abwandeln (wieder nicht ausprobiert):

char buffer[80];
char *str = buffer;
scanf("%s", str);

Merke deutlich: Eine C-Feldvariable ist nichts anderes als ein Zeiger.

Noch mehr Infos...
 

lodger

Normande
Registriert
06.09.05
Beiträge
578
Peter Maurer schrieb:
Merke deutlich: Eine C-Feldvariable ist nichts anderes als ein Zeiger.

Noch mehr Infos...
Richtig, nur das dieser Zeiger i.d.R. dann auch auf einen reservierten Speicherbereich zeigt (die Deklaration: char ucMeinCharArray[10]; reserviert 10 char Elemente im Speicher). Das ist in dem eingehend genannten Quelltext aber nicht so. Der Zeiger verweist auf irgendeine Adresse im Speicher. Das nennt man dann "dangling pointer", der Zeiger "baumelt" so im System herum. Wie Yeti schon schrieb, reicht ein malloc um einen entsprechend großen Speicherbereich zu allokieren und den Zeiger darauf zu setzen. Und anschließend auch wieder frei zu geben. Hat den Vorteil, das Du zur Laufzeit dynamisch auf den benötigten Speicherplatz reagieren kannst. Deine Lösung ist fachlich zwar korrekt, aber auch "nur" eine Array Definition auf Umwegen.
 

Geigaman

Macoun
Registriert
17.03.06
Beiträge
116
Hmm....
Ich kann mir nicht vorstellen, dass sowas verlangt wird. Die Aufgaben orientierten sich bis jetzt doch stark am Skript. Ich habe es jetzt mit malloc gelöst. Mal sehen was mein Betreuer sagt. Danke an Alle die geantwortet haben.
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
Yeti schrieb:
vielleicht sollt Ihr auch einfach malloc/free (new/delete falls C++) benutzen. S.a. http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/malloc.html. Da ist schon fast die Loesung zu Deinem Problem drinnen.

lodger schrieb:
Hat den Vorteil, das Du zur Laufzeit dynamisch auf den benötigten Speicherplatz reagieren kannst. Deine Lösung ist fachlich zwar korrekt, aber auch "nur" eine Array Definition auf Umwegen.

Es ist aber ein Irrtum anzunehmen, dass die komfortable Lösung jedenfalls die beste sei. C-Programmierer brauchen häufig Echtzeit -- z.B. ist es nicht zielführend malloc dessen Implentation und Ausführungszeit systemabhängig/unbekannt/variabel ist z.B. in Software zur Motorsteuerung etc., etc. zu verwenden, weil hier die Taktrate und die Addition der Taktzyklen der einzelnen Prozessorbefehle das Timing ausmachen. Zudem ist malloc auch oft weit ineffizienter als der quasi einkompilierte reservierte Speicherbereich.

mfg pi26
 
Zuletzt bearbeitet: