C - 新分配的字符* 包含现有数据



C 编程新手在这里...

我有一个函数可以执行一些数学运算并将结果存储在输出变量中:

void myFunction(char* output) {
unsigned char myData[64]={0};
// Call to another function which fills the 'myData' array
compute(myData);
// Now let's format the result in our output variable
for (int n=0; n<64; n++) {
sprintf(output, "%s%02x", myData[n]);
}
}

输出字符数组由调用方在名为result的变量中分配:

void main(void) {
char* result = NULL;
result = malloc(129 * sizeof(unsigned char)); // twice the size of myData + 1 ending byte
myFunction(result);
// process result here
// (...)
free(result);
}

问题是我总是result开始时得到一些垃圾,例如:

˶ang/字符串;8fb5ab60ed2b2c06fa43d[...]

在这里,预期数据从8fb5ab60ed2b2c06fa43d开始。在做了一些日志之后,我知道result在 sprintf() 循环之前已经包含���˶ang/String;

我不明白这是怎么发生的:malloc() 函数不应该为我的变量保留内存吗?我猜这些垃圾来自另一个记忆区域,最终会导致一些时髦的行为......

也就是说,我找到了一种解决方法,只需在调用函数之前在result的第一个位置添加一个空结束字节:

result[0]=''; // initialisation
myFunction(result);

现在它工作得很好,但我非常怀疑这是好的做法......有什么建议吗?

这是你的问题:

for (int n=0; n<64; n++) {
sprintf(output, "%s%02x", myData[n]);
}

您的格式说明符sprintf需要一个char *,后跟一个unsigned int。 您只是传入一个unsigned char(转换为int),因此此字符值被解释为地址。 使用错误的格式说明符sprintf调用未定义的行为。

看起来您正在尝试附加到output. 执行此操作的方法是仅包含%02x格式说明符,然后在每次循环迭代中将指针值output2 递增,以便下一次写入发生在正确的位置:

for (int n=0; n<64; n++, output+=2) {
sprintf(output, "%02x", myData[n]);
}

相关内容