Dynam. Array zeigt Visual Studio nicht als solches an.



  • Irgendwie spinnt Visual Studio 2008.
    Habe ein dynamisches Array erstellt:

    int* arr;
    arr = (int*)calloc(4, sizeof(int));
    

    Habe kurz vor Programmende ein Breakpoint gesetzt, um mir das Array anzugucken.
    Aber Visual Studio zeigt das Array nicht richtig an. Klicke ich auf das +, dann wird nur eine Zeile angezeigt. In der Spalte von Name steht nichts drin.

    Komisch ist nur, dass das Array trotzdem funktioniert. Ich kann Elemente schreiben und lesen.
    Warum zeigt Visual Studio 2008 das Array im Debugmodus nicht richtig an?

    Habe eine Win32-Consolenanwendung erstellt und schreibe C-Code in eine .c-File.



  • Ist ja auch kein Array, sonst wären eckige Klammern in der Definition.



  • wie meinst du das?

    Ist doch ein dynamisches Array. Man kann ja auch ganz normal, wie auf jedes Array drauf zugreifen. Nur macht es keinen Spaß damit zu programmieren, wenn man beim Debuggen nicht den Arrayinhalt sieht.
    Andere Entwicklungsumgebungen zeigen den Inhalt problemlos an.



  • Es ist kein Array, sondern ein Speicherbereich.
    Aber da gehen wir in die pedantische Richtung.
    Argument für meine Ausdrucksweise:

    char *p = malloc(1);
    

    Da hab ich ein einziges Byte, das kann niemals ein Array sein, oder? 😉

    Seit C99 assoziieren wir dynamsches Array eher mit sowas:

    int i = (int)clock();
    char p[i];
    


  • dlgig2 schrieb:

    wie meinst du das?

    Ist doch ein dynamisches Array. Man kann ja auch ganz normal, wie auf jedes Array drauf zugreifen. Nur macht es keinen Spaß damit zu programmieren, wenn man beim Debuggen nicht den Arrayinhalt sieht.
    Andere Entwicklungsumgebungen zeigen den Inhalt problemlos an.



  • das ist so wie mit dem teilchen/welle-dualismus. 🤡



  • dlgig2 schrieb:

    Andere Entwicklungsumgebungen zeigen den Inhalt problemlos an.

    ja, manche debugger zeigen den speicherbereich, auf den ein pointer zeigt, fortlaufend an. beim msvc-debugger könntest du z.b. ein memory-window aufmachen, '*dein_pointer' eingeben und die ansicht auf 'int' schalten.
    🙂





  • im watchfenster, kannst du die anzeige als array erzwingen, indem du hinter den pointer-ausdruck ein ",x" schreibst, wobei x, die anzahl der anzuzeigenden Elemente ist.

    also zB

    arr, 10

    zeigt arr an, als wärs ein array mit 10 elementen.



  • flamer schrieb:

    Es ist kein Array, sondern ein Speicherbereich.
    Aber da gehen wir in die pedantische Richtung.
    Argument für meine Ausdrucksweise:

    char *p = malloc(1);
    

    Da hab ich ein einziges Byte, das kann niemals ein Array sein, oder? 😉

    Seit C99 assoziieren wir dynamsches Array eher mit sowas:

    int i = (int)clock();
    char p[i];
    

    Siehe Titel. Visual Studio kennt AFAIK kein C99 😉



  • flamer schrieb:

    char *p = malloc(1);
    

    Da hab ich ein einziges Byte, das kann niemals ein Array sein, oder?

    Ist das hier:

    char p[1];
    

    dann auch kein Array?



  • dann auch kein Array?

    Davor hab ich mich schon gefürchtet.
    Keine Ahnung...
    🙂



  • Belli schrieb:

    char p[1];
    

    dann auch kein Array?

    doch, ist es. die eckigen klammern machen es zum array, nicht die zahl die darin steht.
    🙂



  • flamer schrieb:

    Davor hab ich mich schon gefürchtet.
    🙂

    lol 🕶



  • Mein GCC frisst sogar folgendes:

    char arr[0];
    

    🙂
    Darf er das, so ganz ohne Warnung (auf dem höchsten Warnlevel)?



  • bgdnoy schrieb:

    Mein GCC frisst sogar folgendes:

    das ist bestimmt ein bug. setz doch mal eine negative zahl oder eine fliesskommazahl ein.
    🙂



  • fricky schrieb:

    das ist bestimmt ein bug.

    Scheinbar... 🙂

    char arr[-1];
    

    Beim Compilen:

    main.c: In function `main':
    main.c:8: error: size of array `arr' is negative
    main.c:8: warning: unused variable `arr'
    ...
    

    Aber:

    char arr[0];
    

    Beim Compilen:

    main.c: In function `main':
    main.c:8: warning: unused variable `arr'
    ...
    

    Seltsam, oder?



  • dann benutz doch mal das 0-array. was mach der blöde gcc mit:

    int arr[0];
    arr[0] = irgendwas;
    

    ^^sollte schiefgehen, weil das array ja keine elemente hat.
    🙂



  • Ich bin mir nicht sicher, ob der blöde gcc da meckert.
    Oder würde er

    int arr[5];
    arr [5] = 1;
    

    auch anmeckern?



  • Belli schrieb:

    Ich bin mir nicht sicher, ob der blöde gcc da meckert.
    Oder würde er

    int arr[5];
    arr [5] = 1;
    

    auch anmeckern?

    nein, ein compilefehler gibt's hier nicht, aber ich nehme an, einen 'off-by-one' fehler, der zur laufzeit passiert bei: int a[0]; a[0] =1;
    🙂



  • char vorher[8];
        char arr[0];
        char nachher[8];
    
        arr[0] = 42;
        printf("%d\n", arr[0]);
    
        printf("vorher: %d, arr: %d, nachher: %d", vorher, arr, nachher);
    

    Geht durch, ohne Warnungen wegen arr.
    Ausgabe:

    42
    vorher: 2293608, arr: 2293584, nachher: 2293576
    

    Bin aber gerade draufgekommen, daß auf meiner Windows-Kiste der Compiler schon 4 Jahre alt ist... 🙄
    Das ist noch der von Dev-Cpp: gcc (GCC) 3.4.2 (mingw-special)
    Werd mal nachsehen, was ein neuerer dazu sagt...


Anmelden zum Antworten