1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Blödes C Problem

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Geigaman, 03.07.06.

  1. Geigaman

    Geigaman Macoun

    Dabei seit:
    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
     
  2. pi26

    pi26 Adams Parmäne

    Dabei seit:
    17.12.04
    Beiträge:
    1.297
    In diesem Fall ist str ein char-Pointer, der auf NIL, statt einen Speicherbereich zeigt.

    mfg pi26
     
  3. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    Dein str ist ein Pointer, der ins Nirvana zeigt. Versuch mal das (nicht ausprobiert, deshalb ohne Gewaehr):

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

    Geigaman Macoun

    Dabei seit:
    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 ?
     
  5. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    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...
     
  6. Yeti

    Yeti Gast

    Peter Maurer gefällt das.
  7. lodger

    lodger Normande

    Dabei seit:
    06.09.05
    Beiträge:
    578
    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.
     
  8. Geigaman

    Geigaman Macoun

    Dabei seit:
    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.
     
  9. pi26

    pi26 Adams Parmäne

    Dabei seit:
    17.12.04
    Beiträge:
    1.297
    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
     
    #9 pi26, 03.07.06
    Zuletzt bearbeitet: 03.07.06

Diese Seite empfehlen