Функция, которая возвращает указатель, всегда возвращает одно и то же значение

Я довольно новичок в программировании на C ++, и у меня возникают проблемы с пониманием, где я ошибаюсь с моим текущим проектом. У меня есть большой массив uint32_t, который я хочу заполнить предварительно обработанными значениями. Все хорошо для первого вычисления, но начиная со второго изменяется только адрес памяти обработанного * указателя, а не его значение.

uint32_t *candPreprocessed = (uint32_t*) malloc(sizeof(uint32_t) * indices.size());
for(int j = 0; j < indices.size()-1; j++)
{
char *candidate = (char*) malloc(sizeof(char) * (indices[j+1] - indices[j]) + 1);

...

uint32_t *processed = preprocess((uint8_t*) candidate, len);
memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));
processed = NULL;

// free the messages
free(candidate);
free(processed);
}

Предварительная обработка выглядит так:

uint32_t* preprocess(uint8_t *word, size_t wordLength)
{
uint8_t *toProcess = (uint8_t*) calloc(120, 1);

...

return (uint32_t*) (toProcess);
}

В моем понимании свободный (обработанный) вызов должен освободить память, занятую указателем, созданным во время предварительной обработки. В следующей итерации цикла выбирается новый кандидат и вычисляется новая длина, поэтому аргументы изменяются. Чего мне не хватает, почему это не отражено в выводе?

Кто-нибудь может указать мне правильное направление? Заранее спасибо!

РЕДАКТИРОВАТЬ:
Как и требовалось, краткий автономный пример компиляции —

#include <iostream>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

uint32_t* preprocess(uint8_t *word, size_t wordLength)
{
// preprocessing
uint8_t *toProcess = (uint8_t*) calloc(120, 1);
memcpy(toProcess, word, wordLength);
toProcess[wordLength] = 128;
int numBits = 8 * wordLength;
memcpy(toProcess + 56, &numBits, 1);
return (uint32_t*) (toProcess);
}int main(int argc, char* argv[])
{
char cand[12] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c'};
int indices[4] = {0,4,8,12};
for(int j = 0; j < 3; j++)
{
// extract the message from the wordlist
char *candidate = (char*) malloc(sizeof(char) * (4) + 1);
int i=0;
for(int k = indices[j]; k < indices[j+1]; k++)
candidate[i++] = cand[k];
candidate[i] = '\0';
size_t len = strlen(candidate);

uint32_t *processed = preprocess((uint8_t*) candidate, len);

std::cout << processed << std::endl;

// free the messages
free(candidate);
free(processed);
}

return 0;
}

Это дает три выхода, два из которых одинаковы.

0

Решение

Эта строка добавляет результаты одной итерации в больший буфер:

 memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));

Но это только копирует 4 байта (один uint32_t). Это может быть проблемой.

Если оно является проблема, и вы исправите ее, затем следующая проблема будет в том, что буфер назначения не достаточно велик, чтобы принять все результаты.

Вы упомянули программирование на C ++ — вам будет гораздо проще, если вы попробуете использовать C ++! std::vector очень поможет

0

Другие решения

Поскольку описание проблемы все еще довольно расплывчато (несмотря на множество комментариев), у меня есть некоторое предположение:

memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));

выглядит неправильно для меня. candPreprocessed это указатель на uint32_t, Я подозреваю, что вы на самом деле не хотите перемещать данные в candPreprocessed массив на каждые 4 записи.

Пытаться:

memcpy(candPreprocessed + j, processed, sizeof(uint32_t));
0

По вопросам рекламы [email protected]