Frage zu Pointern



  • Hi,

    ich hab einen Chararray den ich aus einer Datei eingelesen habe.
    Dieses Chararray enthält mehrere Datensätzen von denen ich die am Anfang des Datensatzes einlesen kann. Nun versuche ich das ganze so einzulesen :

    while (position < laenge){
    		char frameName[4] ;
    		int frameLaenge;
    		char *frameValue;
    		strncpy(frameName, Content + position, 4);
    		printf("FrameName : %s \t", frameName);
    		frameLaenge = synchSaveToInt(Content[position + 4], Content[position + 5], Content[position + 6], Content[position + 7]);
    		printf("FrameLaenge : %d \t", frameLaenge);
    		strncpy(frameValue, Content + position + 10, frameLaenge);
    		printf("FrameContent : %s \n", *frameValue); 
    		position += 10 +  frameLaenge;
    }
    

    Aber beim einlesen des frameContent stürzt er leider ab.

    woran kann das liegen?

    Gruß SkySurfer



  • strncpy(frameName, Content + position, 4);
    printf("FrameName : %s \t", frameName);
    

    Ein oft gemachter Fehler: Wie schaut es mit '\0' aus?

    char *frameValue;
    
    [..]
    
    strncpy(frameValue, Content + position + 10, frameLaenge);
    printf("FrameContent : %s \n", *frameValue);
    

    1. Bei dem printf() gehört kein *
    2. Du kopierst Content + position + 10 in frameValue, hast jedoch nicht genug Speicher reserviert. Du schreibst außerhalb deines Speicherbereiches, ergo das Programm stürzt ab.

    Probier das mal aus:

    while (position < laenge){
            char frameName[4] ;
            int frameLaenge;
            char *frameValue;
            strncpy(frameName, Content + position, 4);
            printf("FrameName : %s \t", frameName);
            frameLaenge = synchSaveToInt(Content[position + 4], Content[position + 5], Content[position + 6], Content[position + 7]);
            printf("FrameLaenge : %d \t", frameLaenge);
    
            frameValue = (char*)malloc(frameLaenge * sizeof(char)); 
    
            strncpy(frameValue, Content + position + 10, frameLaenge);
            printf("FrameContent : %s \n", frameValue);
            position += 10 +  frameLaenge;
    
            free(frameValue);
    }
    

    Ich habe aber keinen Plan, ob das auch funktioniert. Mit der dynamischen Speicherverwaltung habe ich noch nie wirklich gearbeitet. Eine Prüfung, ob der Speicher erfolgreich reserviert wurde, würde ich auch noch mochen.

    Mehr findest du wie immer in C von A bis Z - Kapitel 16!



  • Ich habe das malloc noch eingebaut, nun stürzt er zwar nicht mehr ab aber ich erhalte die Ausgabe (null) also irgendwo scheint es noch nicht zu stimmen.

    Nur wo ?



  • Also ich bin grade etwas ratlos :

    char frameValue[frameLaenge];
    for (i = 0; i < frameLaenge; i++){
    	printf("Wert : %d -> %c \n ", i, Content[position + 10 + i ]);
    	frameValue[i] = Content[position + 10 + i];
    }
    printf("FrameValue : %s \n", frameValue);
    position += 10 +  frameLaenge;
    

    ich bekomm die Ausage:

    Wert : 1 -> G
     Wert : 2 -> e
     Wert : 3 -> h
     Wert : 4 -> e
     Wert : 5 -> i
     Wert : 6 -> m
     Wert : 7 -> e
     Wert : 8 ->
     Wert : 9 -> Z
     Wert : 10 -> e
     Wert : 11 -> i
     Wert : 12 -> c
     Wert : 13 -> h
     Wert : 14 -> e
     Wert : 15 -> n
     FrameValue :
    

    Wieso ist trotz richtiger Ausgabe frameValue leer 😕



  • Mich irritiert, dass bei

    for (i = 0; i < frameLaenge; i++){
        printf("Wert : %d -> %c \n ", i, Content[position + 10 + i ]);
        frameValue[i] = Content[position + 10 + i];
    }
    

    du als erste Ausgabe

    Wert : 1 -> G
    

    bekommst.

    Da müsste als erstes

    Wert : 0 -> sonstwas
    

    kommen.

    BTW: Kann es sein, dass

    Content[position + 10]
    

    0 (Null) ist!?

    Greetz, Swordfish



  • Ja darüber hab ich mich auch schon gewundert.

    Laut Hexeditor steht von G ein 0x00



  • nimm mal:

    for (i = 0; i < frameLaenge; i++){
        printf("Wert : %d -> %c \n ", i, Content[position + 11 + i ]);
        frameValue[i] = Content[position + 11 + i];
    }
    

    was in Content steht musst du aber selber wissen!

    Greetz, Swordfish



  • Wenn ich bei 11 starte (das Zeichen 0x00 auslasse) geht es.
    Das heißt er kann kein 0x00 darstellen ?

    Ich bekomme jetzt aber am Anfang der Zeilen komische Zeichen dargestellt..

    FrameName : TIT2Û☺      FrameLaenge : 16        FrameValue : Geheime Zeichen
    FrameName : TALB►       FrameLaenge : 7         FrameValue : Ninive@
    

    Sobald ich die FrameValue weglasse verschwinden Sie.

    while (position < laenge){
    	char frameName[5] ;
    	int frameLaenge;
    
    	strncpy(frameName, content + position, 4);
    	if (strcmp(frameName, "")) {
    		printf("FrameName : %s \t", frameName);
    		frameLaenge = synchSaveToInt(content[position + 4], content[position + 5], content[position + 6], content[position + 7]);
    		printf("FrameLaenge : %d \t", frameLaenge);
    
    		char frameValue[frameLaenge+1];
    		strncpy(frameValue, content + position + 11, frameLaenge - 1);
    		printf("FrameValue : %s \n", frameValue);
    	}			
    	position += 10 +  frameLaenge;
    }
    

    ich hab bei der größe auch schon immer extra +1 gemacht, dass es danach noch ein \0 hat..



  • Gib' mir mal was compilierbares dann wurschtle ich 'mal drüber.

    Greetz, Swordfish


Anmelden zum Antworten