Вопрос

Имея некоторые проблемы с C.У меня есть это мой код:

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

Я передаю этот outbuf методу под названием PK11_CipherOp(), объявленный в библиотеке NSS.Документацию для этого метода можно найти здесь, вы можете видеть, что он ожидает char * для параметра outbuf.

Не могу понять, почему первая линия работает надежно, а вторая нет!

Чтобы увидеть полный код, см. Источник файла

Спасибо,

Гамильтон

Это было полезно?

Решение

Похоже, ваша проблема заключается в отсутствии декларации для malloc - ты не включил <stdlib.h>.

Это означает, что ваш компилятор предполагает, что функция возвращает int, который затем явно приводится к (unsigned char *).Если вы находитесь на платформе, где sizeof(int) != sizeof(void *), как x86-64, то это приведет к искажению значения указателя.

Это прекрасно иллюстрирует, почему в C (в отличие от C++) вам следует нет бросить результат malloc() - в этом нет необходимости, и это скроет от вас именно эту ошибку.Это также иллюстрирует, почему вам следует включать предупреждения компилятора.

Исправление состоит в том, чтобы #include <stdlib.h>, и удалите приведение из malloc() пока ты там.

Приложение:

Другая ваша проблема в том, что вы проходите мимо sizeof(outbuf) к PK11_CipherOp().Это будет правильно (равно out_buf_size) когда outbuf является массивом, но он неверен (размер сам указатель) когда outbuf является указателем.

Замените каждый sizeof(outbuf) с out_buf_size и вам пора идти (позже будет еще один)...

Другие советы

Нашел проблему.Оказывается, я использовал sizeof(outbuf) как один из параметров.Когда outbuf объявлен в стеке, как char outbuf[1024]; это возвращает 1024.Однако, когда outbuf находится в куче, как char * outbuf = malloc(1024); размер outbuf всего 4.Этот параметр сообщал функции, сколько места доступно в outbuf, поэтому функция считала, что у нее есть только 4 байта места.Для этого нужно 16 что-либо поэтому он просто вернулся, не выполнив никакой работы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top