2016-11-18 20 views
0

有两个short s(总共4个字节)的分配内存arr阵列。然后我相应地用这两个元素填充ffffeeee。在我试图遍历与分配给4 char s相同的分配内存之后(总共也是4个字节,但现在我想能够按1个字节查找元素)。正如你从输出中看到的那样,它没有显示出我期望的结果(得到相同的0xeeeeffff分解为4个单独的元素)。代码有什么问题?如何遍历数组将其元素解释为不同类型?

short *arr = malloc(sizeof(short) * 2); 
    *arr = 0xeeee; 
    *(arr + 1) = 0xffff; 
    printf("%p\n", &arr[0]); 
    printf("%p\n", &arr[1]); 
    // convert 
    char * cnv = (char *)arr; 
    printf("=======\n"); 
    for (int i = 0; i < 4; i++) { 
    printf("%p\n", cnv); 
    printf("%x\n", *cnv); 
    cnv++; 
    } 

输出:

0x759010 
0x759012 
======= 
0x759010 
ffffffee # expect 'ee' 
0x759011 
ffffffee # expect 'ee' 
0x759012 
ffffffff # expect 'ff' 
0x759013 
ffffffff # expect 'ff' 
+1

通过'...'传递给printf的'short'和'char'作为'int'传递。这就是'...'的作用。你需要使用'“%hhx”'来将'int'解释为字符(无论如何gcc)。 – Arkadiy

回答

1

%x预计的unsigned int,而不是一个char,因此你的程序未定义的行为。你需要%hhx

+1

[https://ideone.com/abZOVz] –

+0

为什么在这里输入(无符号short *)指针到(void *)printf(“%p \ n”,(void *) &的常用3 [0]);'? –

+0

@TimurFayzrakhmanov:因为这就是'printf'的工作原理。您的原始代码具有未定义的行为。见手册。 –

2

似乎char在你的平台上签署的类型。十六进制0xee被视为负数(-18)。当这个数字被提升为一个整数时,它的二进制表示就是十六进制的0xffffffee

同样的事情发生在0xff

如果使用%d进行打印,则可以在输出中看到负值。

printf("%x %d\n", *cnv, *cnv); 
相关问题