私は C++ プログラミングにかなり慣れていないので、現在のプロジェクトのどこが間違っているのか理解できません。前処理された値で埋めたい uint32_t の大きな配列があります。最初の計算では問題ありませんが、2 番目の計算からは *processed ポインターのメモリ アドレスのみが変化し、その値は変化しません。
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);
}
私の理解では、 free(processed) 呼び出しは、前処理中に作成されたポインターによって占有されていたメモリを解放する必要があります。次のループの反復では、新しい候補がフェッチされ、新しい長さが計算されるため、引数が変更されます。何が足りないのですか?なぜこれが出力に反映されないのですか?
誰かが私を正しい方向に向けることができますか? 前もって感謝します!
編集: 要求に応じて、短い自己完結型のコンパイル例 -
#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;
}
これにより 3 つの出力が生成され、そのうちの 2 つは同じです。