所以我有一个返回unsigned char *
的方法unsigned char* someMethod(num)
unsigned short num;
{
//do some stuff with num and change values of a
unsigned char * a = (unsigned char*) malloc(4);
printf("a0 is %x\n",a[0]);
printf("a1 is %x\n",a[1]);
printf("a2 is %x\n",a[2]);
printf("a3 is %x\n",a[3]);
return a;
}
当我打电话给someMethod(128)时:
unsigned char* s = someMethod(128);
printf("s0 is %x\n",s[0]);
printf("s1 is %x\n",s[1]);
printf("s2 is %x\n",s[2]);
printf("s3 is %x\n",s[3]);
会打印出来
a0 is 30
a1 is 1
a2 is 31
a3 is 30
s0 is 30
s1 is 14
s2 is ffffff9d
s3 is 0
因为我指定了s = someMethod(128),所以对我来说没有任何意义。不应该a和s具有相同的值吗?!? 任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
关于@ gl3829的评论,我跟
一起去了unsigned char *a = malloc(4 * sizeof(*a))
以便大小自动"正确的。
更重要的是,我认为问题是,在someMethod
中,您在实际分配任何内容之前打印出已分配数组中的值。这会调用未定义的行为,并允许产生任何结果。在打印之前尝试存储一些东西。
要以十六进制打印unsigned char
,正确的格式说明符为%hhx
。使用错误的说明符也可以调用未定义的行为。
答案 1 :(得分:1)
在%x
打印时,printf()
函数会读取int
。 32位计算机中的int
长度为4个字节。因此,第2,第3和第4 printf()
正在读取外部和内部 malloc()
区域。你不能指望malloc总是保持不变的区域。
解决方法是,填充它。 Malloc比你现在想要的多几个字节,可能多sizeof(int)
。
解决方案2:在将s[i]
传递给int
printf()
{{1}}