Speichergröße bestimmen eines char-arrays mit sizeof
-
cooky451 schrieb:
@icarus2
sizeof gibt size_t zurück, nicht int.Das hatte ich befuerchtet. War mir aber nicht mehr ganz sicher und hatte keine Lust es nachzuschauen
Danke fuer den Hinweis.
-
cooky451 schrieb:
@icarus2
sizeof gibt size_t zurück, nicht int.Wie lautet der Formatspezifizierer für size_t, der in printf gebraucht wird?
-
Ich hab das einfach immer in ein unsigned long gecastet und dann mit printf ausgegeben.
Kann dir aber nicht sagen, ob das eine saubere Lösung ist...
-
Ich habe mich kurz im Internet umgeschaut und so muesste es fuer C99 funktionieren:
#include <stdio.h> int main(void) { int iarr[] = {2,4,6,4,2,4,5,6,7}; double darr[] = {3.3, 4.4, 2.3, 5.8, 7.7}; char str[] = {"Hallo Welt!"}; size_t size1 = sizeof(iarr); size_t size2 = sizeof(darr); size_t size3 = sizeof(str); printf("%zu\n", size1); printf("%zu\n", size2); printf("%zu\n", size3); }
C89 kennt "%zu\n" allerdings nicht. Wenn man also Rueckwaertskompatibilitaet zu C89 moechte oder gleich mit C89 arbeitet kommt man wahrscheinlich nicht drum herum mit Macros zu arbeiten.
-
icarus2 schrieb:
C89 kennt "%zu\n" allerdings nicht. Wenn man also Rueckwaertskompatibilitaet zu C89 moechte oder gleich mit C89 arbeitet kommt man wahrscheinlich nicht drum herum mit Macros zu arbeiten.
Was soll denn so ein Makroschrott hier bringen? Nichts, nur Unübersichtlichkeit.
-
Wutz schrieb:
icarus2 schrieb:
C89 kennt "%zu\n" allerdings nicht. Wenn man also Rueckwaertskompatibilitaet zu C89 moechte oder gleich mit C89 arbeitet kommt man wahrscheinlich nicht drum herum mit Macros zu arbeiten.
Was soll denn so ein Makroschrott hier bringen? Nichts, nur Unübersichtlichkeit.
Auf Stackoverflow wurde folgendes vorgeschlagen:
#if defined(_MSC_VER) #define JL_SIZE_T_SPECIFIER "%Iu" #define JL_SSIZE_T_SPECIFIER "%Id" #define JL_PTRDIFF_T_SPECIFIER "%Id" #elif defined(__GNUC__) #define JL_SIZE_T_SPECIFIER "%zu" #define JL_SSIZE_T_SPECIFIER "%zd" #define JL_PTRDIFF_T_SPECIFIER "%zd" #else // TODO figure out which to use. #if NUMBITS == 32 #define JL_SIZE_T_SPECIFIER something_unsigned #define JL_SSIZE_T_SPECIFIER something_signed #define JL_PTRDIFF_T_SPECIFIER something_signed #else #define JL_SIZE_T_SPECIFIER something_bigger_unsigned #define JL_SSIZE_T_SPECIFIER something_bigger_signed #define JL_PTRDIFF_T_SPECIFIER something-bigger_signed #endif #endif
Ich nehme an du findest das keine gute Loesung. Wie wuerde denn eine bessere Loesung des Problems aussehen?
-
Auf den größten integralen unsigned Typ casten und fertig. Funktioniert immer im Gegensatz zu den Makros mit ihren ifdefs.
-
Ich dachte immer, size_t sei ein typedef für unsigned long.
-
Wutz schrieb:
Auf den größten integralen unsigned Typ casten und fertig. Funktioniert immer im Gegensatz zu den Makros mit ihren ifdefs.
Ist auch nicht besonders schoen aber zugegeben: Viel schoener als die Macros
-
Bonni4355 schrieb:
Ich dachte immer, size_t sei ein typedef für unsigned long.
Meistens. Aber nicht unbedingt.