Question

Ayant quelques problèmes avec C. J'ai c'est mon code:

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

Je passe ce outbuf à une méthode appelée PK11_CipherOp(), a déclaré dans la bibliothèque NSS. La documentation de cette méthode se trouve ici , vous pouvez voir qu'il attend un char * pour la outbuf param.

Je ne comprends pas pourquoi la première ligne fonctionne de manière fiable, et la deuxième ligne ne fonctionne pas!

Pour voir le code complet, s'il vous plaît voir fichier source

Merci,

Hamilton

Était-ce utile?

La solution

Votre problème semble être une déclaration manquante pour malloc -. Vous n'avez pas inclus <stdlib.h>

Cela signifie que votre compilateur assume la fonction retourne int, qui est explicitement jeté à (unsigned char *) alors. Si vous êtes sur une plate-forme où sizeof(int) != sizeof(void *), comme x86-64, alors ce sera Mutile la valeur du pointeur.

Ceci illustre parfaitement pourquoi, en C (contrairement à C ++), vous devez pas jeter le résultat de malloc() - faire est inutile, et cache ce bogue exact de vous. Elle illustre aussi pourquoi vous devez activer les avertissements du compilateur.

Le correctif est à #include <stdlib.h>, et enlever la distribution de malloc() pendant que vous êtes là.

Addendum:

Votre autre problème est que vous passez à sizeof(outbuf) PK11_CipherOp(). Ce sera correct (égal à out_buf_size) lorsque outbuf est un tableau, mais il est incorrect (la taille du lui-même pointeur ) lorsque outbuf est un pointeur.

Remplacer chaque sizeof(outbuf) avec out_buf_size et vous devriez être bon d'aller (il y a une autre plus tard aussi) ...

Autres conseils

ajoute que la question. Avère que j'utilisais sizeof(outbuf) comme l'un des paramètres. Lorsque le outbuf est déclaré sur la pile, comme char outbuf[1024]; cela renvoie 1024. Toutefois, lorsque outbuf sur le tas, comme char * outbuf = malloc(1024); la taille de outbuf est juste 4. Ce paramètre dit la fonction combien de place était disponible dans le outbuf, de sorte que le fonction pensé qu'il avait seulement 4 octets de chambre. Il a besoin de 16 faire quoi que ce soit il vient de rentrer sans effectuer aucun travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top