Frage

Ich habe einige Probleme mit C. Ich habe das ist mein Code:

// First line works, second line does not! 
char outbuf[1024];
// char *outbuf = (char *) malloc(1024);  // char is always 1

Ich übergeben diesen Outbuf an eine Methode namens namens PK11_CipherOp(), in der NSS -Bibliothek deklariert. Die Dokumentation für diese Methode kann gefunden werden hier, Sie können sehen, dass es a erwartet char * Für den Outbuf -Param.

Ich kann nicht verstehen, warum die erste Zeile zuverlässig funktioniert und die zweite Zeile nicht!

Um den vollständigen Code zu sehen, siehe bitte Dateiquelle

Vielen Dank,

Hamilton

War es hilfreich?

Lösung

Ihr Problem scheint eine fehlende Erklärung für zu sein malloc - Sie haben nicht aufgenommen <stdlib.h>.

Dies bedeutet, dass Ihr Compiler die Funktionen annimmt int, was dann ausdrücklich zugegossen wird (unsigned char *). Wenn Sie auf einer Plattform sind, wo sizeof(int) != sizeof(void *), Wie X86-64 wird dies den Zeigerwert merkeln.

Dies zeigt perfekt, warum Sie in C (im Gegensatz zu C ++) Sie sollten nicht wirken das Ergebnis von malloc() - Dies ist unnötig und verbirgt diesen genauen Fehler vor Ihnen. Es zeigt auch, warum Sie Compiler -Warnungen einschalten sollten.

Die Lösung ist zu #include <stdlib.h>, und entfernen Sie die Besetzung aus malloc() Während du da bist.

Nachtrag:

Ihr anderes Problem ist, dass Sie bestehen sizeof(outbuf) zu PK11_CipherOp(). Dies wird korrekt sein (gleich out_buf_size) Wenn outbuf ist ein Array, ist aber falsch (die Größe des Zeiger selbst) Wenn outbuf ist ein Zeiger.

Jedes ersetzen sizeof(outbuf) mit out_buf_size Und du solltest gut gehen zu gehen (es gibt auch einen anderen) ...

Andere Tipps

Fand das Problem. Es stellt sich heraus, dass ich benutzte sizeof(outbuf) als einer der Parameter. Wenn der Outbuf auf dem Stapel deklariert wird, als char outbuf[1024]; Dies gibt 1024 zurück, wenn Outbuf auf dem Haufen ist, wie char * outbuf = malloc(1024); Die Größe von Outbuf beträgt nur 4. Dieser Parameter sagte der Funktion, wie viel Raum im Outbuf verfügbar war, so dass die Funktion der Meinung war, dass er nur 4 Bytes Zimmer hatte. Es braucht 16, um zu tun irgendetwas Also kehrte es einfach zurück, ohne Arbeit auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top