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

时间:2018-04-16 15:37:39

标签: c pointers char malloc

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

现在它完美无缺,但我非常怀疑这是一个好习惯......有什么建议吗?

1 个答案:

答案 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]);
}