Frage zu Quellcode



  • Hi Leute,
    ich hab mich gefragt ob folgender code legal ist?

    float *p;
    if(true){
      float arr[9]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9};
      p = &arr[0];
    }
    for (int i = 0; i < 9; i++) {
      printf("%f\n",*(p+i));
    }
    

    ich bekomme als Ausgabe:

    1.100000
    2.200000
    3.300000
    4.400000
    5.500000
    6.600000
    7.700000
    8.800000
    9.900000
    

    also eigentlich das Richtige, doch irgendwie hab ich das gefühl das das nur zufall ist weil ich sonst keine Variablen mehr definiere.

    Ich würde mich über eine Erklärung freuen

    Was mir ebenfalls unklar ist warum es *(p+i) heißt und nicht *(p+i*sizeof(float))

    LG XBert



  • Ist legal unter #include <stdbool.h> .

    XBert schrieb:

    irgendwie hab ich das gefühl das das nur zufall ist weil ich sonst keine Variablen mehr definiere.

    Quotation for the day: "a counter that doesn't exist can't get messed up."
    Du brauchst nicht mal p , kannst arr stattdessen nehmen.

    XBert schrieb:

    Was mir ebenfalls unklar ist warum es "(p+i)" heißt und nicht "(p+i*sizeof(float))"

    Weil C sich im Hintergrund darum kümmert, das bei p + 1 nicht um ein Byte hochgezählt wird, sondern um soviele, wie der Typ gross ist, auf den p zeigen kann.
    🙂



  • µngbd schrieb:

    Du brauchst nicht mal p , kannst arr stattdessen nehmen.

    Das glaube ich nicht, da arr nur innerhalb der if-schleife gültig ist

    Aber gaut zu wissen, dass das andere gültig ist



  • Das glaube ich nicht, da arr nur innerhalb der if-schleife gültig ist

    Argh, hast recht. Das geht so nicht. arr ist nach dem Block längst tot, dort kann irgendetwas stehen. Man müsste es static machen.
    🙂



  • Hi,

    XBert schrieb:

    was mir ebenfalls unklar ist warum es *(p+i) heißt und nicht *(p+i*sizeof(float))

    LG XBert

    Der Compiler weiß, das er i*sizeof(float) rechnen muss. Genau so wie er weiß, das er bei p++ sizeof(float) bytes draufaddiert.

    Gruß,
    B.B.


Anmelden zum Antworten