malloc



  • hallo,

    ich wollte ueber die funktion malloc, speicher fuer 5 char elemente allokieren und diese elemte mit einem wert versehen. wenn ich den string allerdings ausgeben moechte gibt er am ende noch zeichenmuell aus...

    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
    	char *p;
    
    	p = (char*)malloc(5 * sizeof(char));
    
    	for(int i = 0; i < 5; i++)
    	{
    		p[i] = '-';
    	}
    
    	printf("%s\n", p);
    }
    

    ausgabe: -----²²²²

    weiss jemand was ich falsch mache?



  • \0



  • Zudem: malloc() wird nicht gecastet und sizeof(char) ist immer 1.

    edit: Und void main() ist idR. auch falsch. -> int main(void) oder int main(int argc, char **argv)...



  • Hi!

    Du musst p[ 5 ] = '\0' setzten, das C weis wo der String endet.
    sizeof( char ) ist mitnichten immer eins, das hängt von Plattforum und was weis ich was ab.

    void main ist dafür tatsächlich ein Fehler! 😉

    grüße



  • David_pb schrieb:

    sizeof( char ) ist mitnichten immer eins, das hängt von Plattforum und was weis ich was ab.

    Nein. sizeof(char) ist _immer_ 1.



  • David_pb schrieb:

    Du musst p[ 5 ] = '\0' setzten, das C weis wo der String endet.

    p[4]



  • David_pb schrieb:

    Du musst p[ 5 ] = '\0' setzten, das C weis wo der String endet.

    Aber das Array dann auch 1 Zeichen länger machen, sonst wird über das Ende hinausgeschrieben.

    David_pb schrieb:

    sizeof( char ) ist mitnichten immer eins

    6.5.3.4 The sizeof operator
    [...]
    When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.

    😉



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
    	char *p;
    
    	p = (char*)malloc(5 * sizeof(char));
    
    	for(int i = 0; i < 5; i++)
    	{
    		p[i] = '-';
    	}
    
    	printf("%.5s\n", p);
    
            return 0;
    }
    


  • Wenn schon die Länge bestimmen, dann auch den richtigen Formatmodifizierer verwenden.

    printf("%.5s\n", p);
    


  • Hi!

    @TactX:
    Jo, sorry... War irgendwie voll neben der Kappe! 🙄 Du hast natürlich recht! 🙂

    grüße



  • groovemaster schrieb:

    Wenn schon die Länge bestimmen, dann auch den richtigen Formatmodifizierer verwenden.

    printf("%.5s\n", p);
    

    Bei mir klappt beides...



  • #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
        char *p;
    
        p = (char*)malloc((5 + 1) * sizeof(char));
    
        for(int i = 0; i < 5; i++)
        {
            p[i] = '-';
            if(i == 4)
            {
                p[i+1] = '\0';
            }
        }
    
        printf("%s\n", p);
    }
    

    so ist das doch am schoensten programmiert 😉



  • omg, so viel gefrickel...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        int len = 5;
        char *p = malloc(len+1);
        if (!p) return 1;
        memset(p, '-', len);
        p[len] = 0;
        puts(p);
        return 0;
    }
    


  • ProgChild schrieb:

    Bei mir klappt beides...

    Was klappt und was korrekt ist, sind immer noch zwei verschiedene Sachen. Und korrekt ist nur %.5s. Bei %5s wird lediglich eine Mindestlänge der Ausgabe festgelegt. Das undefinierte Verhalten wird damit im besagten Fall aber nicht beseitigt, da der String nicht abgeschnitten wird. Alles was bei dir also klappt, ist undefiniertes Verhalten.



  • groovemaster schrieb:

    ProgChild schrieb:

    Bei mir klappt beides...

    Was klappt und was korrekt ist, sind immer noch zwei verschiedene Sachen. Und korrekt ist nur %.5s. Bei %5s wird lediglich eine Mindestlänge der Ausgabe festgelegt. Das undefinierte Verhalten wird damit im besagten Fall aber nicht beseitigt, da der String nicht abgeschnitten wird. Alles was bei dir also klappt, ist undefiniertes Verhalten.

    Hast recht, habs eben nachgelesen. Dummerweise steht es im Buch "C von A bis Z" falsch drinn...


Anmelden zum Antworten