当使用 LLVM 编译器编译以下代码时,它无法正确运行。 (我不增加。) 使用 GCC 4.2 编译时它可以正常运行。 这是 LLVM 编译器的错误吗?
#include <stdio.h>
#include <string.h>
void BytesFromHexString(unsigned char *data, const char *string) {
printf("bytes:%s:", string);
int len = (int)strlen(string);
for (int i=0; i<len; i+=2) {
unsigned char x;
sscanf((char *)(string + i), "%02x", &x);
printf("%02x", x);
data[i] = x;
}
printf("\n");
}
int main (int argc, const char * argv[])
{
// insert code here...
unsigned char data[64];
BytesFromHexString(data, "4d4f5cb093fc2d3d6b4120658c2d08b51b3846a39b51b663e7284478570bcef9");
return 0;
}
最佳答案
对于 sscanf
,您将使用 %2x
而不是 %02x
。此外,%2x
表示将传递一个额外的 int*
参数。但是您传递的是 unsigned char*
。最后,sscanf
将 const char*
作为第一个参数,因此不需要强制转换。
所以试一试:
int x;
sscanf((string + i), "%2x", &x);
编辑:澄清此更改解决问题的原因:在您的代码中,sscanf
尝试将 sizeof(int)
字节写入只能容纳 sizeof(unsigned char)
字节(即 1 个字节)的内存位置 (&x
)。所以,你覆盖了一定数量的内存。这个被覆盖的内存很可能是(的一部分)i
变量。
关于c - LLVM 编译器 2.0 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7021588/