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]);
}
}
输出char数组由调用者在名为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
开始。在做了一些日志之后,我知道{/ 1}}在 sprintf()循环之前已经包含result
。
我不明白这是怎么发生的:是不是malloc()函数应该为我的变量保留内存?我猜这个垃圾来自另一个记忆区域,最终会导致一些时髦的行为......
也就是说,在调用函数之前,我在���˶ang/String;
的第一个位置添加了一个空结束字节,我找到了一个解决方法:
result
现在它完美无缺,但我非常怀疑这是一个好习惯......有什么建议吗?
答案 0 :(得分:4)
这是你的问题:
for (int n=0; n<64; n++) {
sprintf(output, "%s%02x", myData[n]);
}
sprintf
的格式说明符需要char *
后跟unsigned int
。您只传入unsigned char
(转换为int
),因此该字符值被解释为地址。使用错误的格式说明符sprintf
会调用undefined behavior。
您似乎试图附加到output
。这样做的方法是只包含%02x
格式说明符,然后在每次循环迭代时将指针值output
递增2,以便下一次写入发生在正确的位置:
for (int n=0; n<64; n++, output+=2) {
sprintf(output, "%02x", myData[n]);
}