argv, Zeigerarrays und andere Widrigkeiten ;o)



  • Kennst Du schon das Tutorial auf www.pronix.de ?

    Da wird das und noch viel mehr, verständlich und leicht erklärt 🙂

    Nix altes Windows, sondern neues Linux

    dito 🙂



  • Kenne es schon, aber da habe ich in Bezug auf die kleine argv-Frage keine Antwort gefunden 😞



  • Original erstellt von RTC:
    Letzter Hint hierzu nochmal: wieso darf ich argv++ ausführen, wenn doch argv ein konstanter Zeiger ist? Bashar hatte eine kleine Lösung angegeben, doch damit kann ich wenig anfangen: "Weil Array an Funktionen als Zeiger übergeben werden."
    Kann mir das jemand nochmal kurz erklären?

    also sowas:

    int main(int argc,char** argv)
    {
        ++argv;
        return 0;
    }
    

    tja, also argv ist hier nicht konstant. ist ne lokale variable, die auf den ersten argument-string zeigt. so nen übergebenen zeiger kannste ändern. macht man manchmal auch ganz gerne, wie hier:

    int strlen(char* str)
    {
      int result=0;
      while(*str)
      {
        ++result;
        ++str;
      }
      return result;
    }
    

    gemeiner wirds hierbei:

    int main(int argc,char *argv[])
    {
        ++argv;
        return 0;
    }
    

    das darf natürlich nicht klappen. außer, bashar hat nen guten grund.

    erstmal seine these prüfen, daß da heimlich nu ein zeiger übergeben wird.

    void test(double x[])
    {
        cout<<sizeof(x)<<endl;
    }
    int main()
    {
        double a[10];
        cout<<sizeof(a)<<endl;
        test(a);
        return 0;
    }
    

    ausgabe:

    80 
    4
    

    aha. durch irgend eine compilermagie wurde in der tat dafür gesorgt, daß x innerhalb der funktion nur ein zeiger ist. hat vermutlich den grund, daß es viel zu lange dauern würde, alle 80 bytes zu kopieren bei jedem funktionsaufruf.
    wenn ich jetzt ganz fest an die compilermagie glaube, ganz fest daran, daß da in wirklichkeit statt void test(double x[]) nur ein void test(double *x) steht, dann klappt ++x.



  • Original erstellt von volkard:
    **also sowas:

    int main(int argc,char** argv)
    {
        ++argv;
        return 0;
    }
    

    tja, also argv ist hier nicht konstant.
    [...]
    gemeiner wirds hierbei:

    int main(int argc,char *argv[])
    {
        ++argv;
        return 0;
    }
    

    das darf natürlich nicht klappen. außer, bashar hat nen guten grund.**

    Bin zwar nicht bashar, aber ich antworte trotzdem mal 🙄
    Beide Beispiele sind äquivalent.
    "A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation." (ISO/IEC 9899:1999, 6.7.5.3-7)
    int main(int argc,char argv[])
    wird also so ausgewertet, als würde da
    int main(int argc,char
    * argv)
    stehen.



  • Ok danke!
    Das hat mir erstmal weiter geholfen.
    Thx a lot...
    😃


Anmelden zum Antworten