短的无符号数据中的字节分配

时间:2013-05-13 10:41:07

标签: c

请检查以下程序

#include <stdio.h>
#include<stdlib.h>
int main()
{
        char *Date= NULL;
        unsigned short y=2013;
        Date =  malloc(3);
        sprintf((char *)Date,"%hu",y);  
        printf("%d %d %d %d %d \n",Date[0],Date[1],Date[2],Date[3],Date[4]);

        printf("%s %d %d",Date,strlen(Date),sizeof(y));
}

output:
50 48 49 51 0
2013 4 2

我如何获得字符串长度4而不是2,因为我将一个短整数值放入内存中,因此它应该占用2字节的内存。但它是如何占用4个字节。

每个字节如何从输入获得2 0 1 3,而不是一个字节中的20个和另一个字节中的13个。

我想把20个字节和13个字节放到另一个字节。如何做到这一点。热情地说出来

请给出一些答案。

2 个答案:

答案 0 :(得分:5)

正如其名称所示,sprintf函数编写一个格式化的字符串。因此,您的号码2013将转换为“2013”​​(5个字符的字符串)。

答案 1 :(得分:3)

您正在调用未定义的行为

您只为Date分配了3个字节并存储了5个字节。

2013的四个字节和1个NUL字节。因此,如果要存储2013,则应至少分配5个字节。


如果要传输字节流,我建议您按以下方式进行:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
        unsigned char *Date= NULL;
        unsigned short y=2013;
        unsigned char *p;

        p = (unsigned char*) &y;
        Date =  malloc(3);
        Date[0] = *p;
        Date[1] = *(p+1);
        Date[2] = 0;

        printf("%s %d %d",Date,strlen(Date),sizeof(y));
}

输出:

� 2 2

奇怪的char是因为将一些字节值解释为字符串。普通字符可以是签名或未签名,具体取决于您的实现。因此,请使用unsigned char来避免对字节的错误解释。