#define char arrays und "\0" zeichen



  • Hallo Zusammen,

    wenn ich einen char array mit Praeprozessor direktiv definiere, wird ein
    "\0" zeichen automatisch am Ende hinzugefuegt?

    #define SATRIANI "joe"

    Zeigt der "sizeof(SATRIANI)" 4 an? Muss ich dementsprechend

    #define SATRIANI_LENGTH (sizeof(SATRIANI)-1)

    machen, um den wahren array groesse zu erhalten?

    Gruss,



  • das ist kein array, sondern 'ne stringkonstante. die echte länge kriegste mit sizeof() raus. und ja, eine 0 hängt auch noch mit dran.
    🙂



  • #define-freak schrieb:

    das ist kein array, sondern 'ne stringkonstante.

    Danke fuer den Hinweis ;).

    #define-freak schrieb:

    die echte länge kriegste mit sizeof() raus. und ja, eine 0 hängt auch noch mit dran.

    super danke noch mal.



  • aber sizeof kannst du nur dann benutzen, wenn du eine Stringliteral hast (sprich eine Stringkonstante).

    const char *test = SATRIANI;
    printf("%d %d\n", sizeof(SATRIANI), sizeof(test));
    

    sizeof(test) würde immer 4 ausgeben, egal wie lang SATRIANI ist. Am besten ist es strlen für die Länge des Strings zu benutzen.



  • supertux schrieb:

    sizeof(test) würde immer 4 ausgeben...

    falsch. sizeof(test) würde immer die grösse eines 'char*' ausgeben.
    🙂



  • sizeof()-freak schrieb:

    supertux schrieb:

    sizeof(test) würde immer 4 ausgeben...

    falsch. sizeof(test) würde immer die grösse eines 'char*' ausgeben.
    🙂

    👍



  • sizeof()-freak schrieb:

    falsch. sizeof(test) würde immer die grösse eines 'char*' ausgeben.

    ist wahr ;).

    Ich habe gerade festgestellt, dass Nutzung von sizeof() schlechte Idee ist, wenn man string-concats durch memcpy macht...

    /*..from definitions.h */
    #define SATRIANI "joe"
    #define SATRIANI_LEN sizeof(SATRIANI)
    /*.end definitions.h. */
    
    /* main.c */ 
    #include "definitions.h"
    
    memcpy(p, SATRIANI,SATRIANI_LEN);
    p += SATRIANI_LEN;
    
    memcpy(p, CRLF, CRLF_LEN);   /* memcpy kopiert den \r\n zeichen nicht */
    p += CRLF_LEN ;
    

    Hier wird das Stringkonstant ohne CRLF uebertragen.
    Wenn ich SATRIANI_LEN mit strlen definiere, dann wird der Linebreak kopiert.
    Validert der memcpy am anfang ob der Zeiger auf Null-Byte zeigt oder nicht?
    In man page von memcpy konnte ich nichts darueber finden.

    Gruss,



  • sizeof()-freak schrieb:

    supertux schrieb:

    sizeof(test) würde immer 4 ausgeben...

    falsch. sizeof(test) würde immer die grösse eines 'char*' ausgeben.
    🙂

    verdammt, einmal eine ungenaue Antwort und dann gibt's Gemekcer. Unrecht hast du aber nicht.

    jsbach schrieb:

    Ich habe gerade festgestellt, dass Nutzung von sizeof() schlechte Idee ist, wenn man string-concats durch memcpy macht...

    ist klar, dafür ist man: strlen(3) da (und generell besser geeignet, wenn man mit der Länge des Strings arbeiten muss!). sizeof(x) gibt dir lediglich den Speicherverbrauch an, den durch x verursacht wird.

    Was deinem Code anbetrifft: Um Strings zu kopieren gibt es: man: strcpy(3) und man: strncpy(3). Um Strings einanander zu hängen gibt es man: strcat(3) und man: strncat(3). Es sollte außerdem p += SATRIANI_LEN - 1; heißen, denn sonst kopierst du CRLF ab dem ersten abschließenden \0 und deswegen sieht es so aus, als würde memcpy das nicht kopieren. Du musst nämlich das abschließende \0 von SATRIANI mit dem ersten Zeichen von CRLF überschreiben.

    Validert der memcpy am anfang ob der Zeiger auf Null-Byte zeigt oder nicht?

    nein, die Funktion memcpy interessiert es nicht, ob sie \0 Zeichen kopiert oder nicht, sondern wie viele Bytes sie kopiert.


Anmelden zum Antworten