我是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);
}
根据我的理解,free(已处理)调用应该释放在预处理期间创建的指针所占用的内存。在循环的后续迭代中,将获取新的候选项并计算新的长度,因此参数会发生变化。我错过了什么,为什么这不会反映在输出中?
有人能指出我正确的方向吗?提前谢谢!
编辑: 根据要求,简短的自包含编译示例 -
#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 :(得分:0)
此行似乎将一次迭代的结果附加到更大的缓冲区:
memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));
但它只复制4个字节(单个uint32_t
)。这可能是问题所在。
如果 问题,并且你修复了它,那么下一个问题就是目标缓冲区不够大,无法获取所有结果。
你提到C ++编程 - 如果你真的尝试使用C ++,你会发现这很容易! std::vector
会有很多帮助。
答案 1 :(得分:0)
由于问题的描述仍然很模糊(尽管有很多评论),我有点猜测:
memcpy(candPreprocessed + j * sizeof(uint32_t), processed, sizeof(uint32_t));
对我来说不对。 candPreprocessed
是指向uint32_t
的指针。我怀疑你实际上并不想每4个条目将数据移入candPreprocessed
数组。
尝试:
memcpy(candPreprocessed + j, processed, sizeof(uint32_t));