4

所以我有一个返回 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 不应该具有相同的值吗?!?任何帮助表示赞赏。谢谢!

4

2 回答 2

1

参考@gl3829 的评论,我会选择

unsigned char *a = malloc(4 * sizeof(*a))

以便大小“自动”正确。

更重要的是,我认为一个问题是,someMethod在实际分配任何内容之前,您会打印出分配数组中的值。这会调用未定义的行为并允许产生任何结果。在打印出来之前尝试存储一些东西。

对于以十六进制打印unsigned chars,正确的格式说明符是%hhx. 使用错误的说明符也可以调用未定义的行为。

于 2012-11-30T01:59:49.657 回答
1

当您在 中打印时%x,该printf()函数会读取int. 在int32 位计算机中,长度为 4 个字节。因此,第 2、3 和 4 号在区域外和区域内printf()阅读。您不能期望 malloc 之外的区域始终保持不变。malloc()

解决办法是,垫。sizeof(int)Malloc比您当前想要的多几个字节,可能更多。


解决方案 2:在将其传递给之前将其类型s[i]转换为firstintprintf()

于 2012-11-30T02:17:39.493 回答