Falscher Formatbezeichner in scanf("%d", unsigned short int) nach gets(Zeiger) ändert die char-Zeiger den Wert, aber warum?

Ich habe vor kurzem versucht, etwas C-Programmierung und stolperte über Folgendes problem. Ich bin mit NetBeans 7.4 64-IDE mit MinGW 32 Bit. Dies ist eine kurze Beispiel-code, die unterstreicht mein problem:

int main(void) {

    unsigned short int temp;
    char *pointer;
    pointer = malloc(12 * sizeof(char));

    printf("The pointers value is %d \n", (int)pointer);
    printf("Type a short string:\n");

    gets(pointer);

    printf("The pointers value is %d \n", (int)pointer);
    printf("Type an int: \n");

//This line changes the char pointer to an apparently random value
    scanf("%d", &temp);

//Segmentation fault upon this point
    printf("The pointers value is %d \n", (int)pointer);

//And here as well
    free(pointer);


    return (EXIT_SUCCESS);
}

Bis scanf alles in Ordnung ist. Der string gelesen wird, ist geschrieben in dem Speicher-Zeiger gerichtet ist. Aber NACH scanf verarbeitet wurde, pointer-Wert wird so geändert, dass der Zeiger zeigt auf jeden Raum. Also nicht nur mein string ist verloren, aber ich bekomme auch die Segmentierung Fehler beim Zugriff /freie memory, das gehört nicht zu meinem Programm.

Den Wert ändern, ist scheinbar zufällig. Jedes mal, wenn ich Debuggen das Programm, das den Mauszeiger verändert sich zu einem anderen Wert.

Habe ich bereits ableiten, dass die unsigned short int ist Schuld, oder eher die falsche Formatbezeichner ("%d statt %hu) in meinem scanf. Wenn ich ändern Sie entweder unsigned short int int "oder" %hu als Planer, funktioniert alles einwandfrei. So gibt es die Lösung.

Aber ich bin immer noch neugierig, warum und wie die Zeiger der betroffene durch diesen Fehler. Wer kann mir da helfen?

Verwenden Sie niemals gets. Es bietet keinen Schutz gegen einen buffer-overflow-Schwachstelle.

InformationsquelleAutor clancy688 | 2013-11-06

Schreibe einen Kommentar