Frage zu scanf mit char und Adresse




  • Mod

    Das sind dann aber die Anfänger, die nicht beurteilen können, ob es gut war oder nicht. Siehe auch:
    http://xkcd.com/937/



  • Der Autor der Kritik hat ja größtenteils recht, aber zwei Dinge interessieren mich:

    'array' und '&array' sind eben nicht das Gleiche

    Nein? Könnte mir das jemand erklären? (Gerne gleich mit Verweiß auf den Standard.)

    feof wird direkt nach fopen verwendet ( ohne Hinweis auf Besonderheiten )

    Besonderheiten?


  • Mod

    lopfl schrieb:

    'array' und '&array' sind eben nicht das Gleiche

    Nein? Könnte mir das jemand erklären? (Gerne gleich mit Verweiß auf den Standard.)

    Das eine ist ein Array, das andere ist ein Zeiger auf ein Array. Das kann in vielen Kontexten die gleiche Wirkung haben, da einerseits ein Array beim kleinsten Zeichen von Gefahr in einen Zeiger auf sein erstes Element zerfällt und andererseits ein Zeiger auf ein Array sich ohne Murren in einen Zeiger auf das erste Element konvertieren lässt, aber es ist nicht das gleiche

    feof wird direkt nach fopen verwendet ( ohne Hinweis auf Besonderheiten )

    Besonderheiten?

    Manche Leute haben da den Tick, dass da ein Sonderfall vorliegt, aber ich habe nie verstanden, wieso sie das so sehen. Irgendwas vonwegen, dass feof bei leerer Datei nach dem Öffnen nicht gesetzt ist. Was ich aber genau so auch erwarten würde.



  • SeppJ schrieb:

    Wutz hat da den Tick, dass da ein Sonderfall vorliegt, aber niemand hier hat je verstanden, wieso er das so sieht.

    Wutz hat auch bereits zwei Links auf Rezensionen von "Max" gepostet, glaubt hier einer an Zufall :xmas2: ?

    Äquivalent zu array wäre doch &array[0] , mit dem Zeiger wäre call by reference möglich:

    void f1(const char* array)
    {
    	array = "Word";
    }
    void f2(const char** array)
    {
    	*array = "World";
    }
    int main()
    {
    	const char* src = "Hello";
    	const char* c = src;
    	puts(c);
    	f1(c);
    	puts(c);
    	f2(&c);
    	puts(c);
    	return 0;
    }
    

    Ausgabe wie erwartet

    Hello
    Hello
    World
    


  • Thorgrim schrieb:

    Äquivalent zu array wäre doch &array[0] , mit dem Zeiger wäre call by reference möglich:

    Nein, das ist ein anderes Problem. Denke mal an sizeof. 😉
    Edit: Abgesehen davon gibt es in deinem Code nicht mal ein Array? oO
    Edit2: @SeppJ: Die erste Version trifft es aber auf den Punkt. 🤡



  • cooky451 schrieb:

    Denke mal an sizeof. 😉
    Edit: Abgesehen davon gibt es in deinem Code nicht mal ein Array? oO

    Ich geh ins Bett 🤡



  • SeppJ schrieb:

    lopfl schrieb:

    'array' und '&array' sind eben nicht das Gleiche

    Nein? Könnte mir das jemand erklären? (Gerne gleich mit Verweiß auf den Standard.)

    Das eine ist ein Array, das andere ist ein Zeiger auf ein Array. Das kann in vielen Kontexten die gleiche Wirkung haben, da einerseits ein Array beim kleinsten Zeichen von Gefahr in einen Zeiger auf sein erstes Element zerfällt und andererseits ein Zeiger auf ein Array sich ohne Murren in einen Zeiger auf das erste Element konvertieren lässt, aber es ist nicht das gleiche

    Ein Arrayname zerfällt außer bei 4 hier nicht relevanten Ausnahmen in einen Zeiger auf das erste Element/Elementtyp, &Arrayname zerfällt in einen Zeiger auf das ganze Array. Nirgendwo im Standard steht, dass Array und Einzelelement das gleiche Alignment haben müssen, und deshalb
    `A pointer to an object or incomplete type may be converted to a pointer

    to a different object type or a different incomplete type. The

    resulting pointer might not be valid if it is improperly aligned for

    the type pointed to.`
    Kapitel 3.3.4 ANSI C




  • Mod

    Wutz schrieb:

    Nirgendwo im Standard steht, dass Array und Einzelelement das gleiche Alignment haben müssen,

    Sicher? Mindestens bei C++ ist dies garantiert, daher nahm ich immer an, dass das bei C auch so ist. Aber ich werde jetzt nicht den ganzen C-Standard durchwühlen, um das genau heraus zu finden, wenn du mir sagst, dass du da wirklich sicher bist.


Anmelden zum Antworten