在处理内存方面,这两个C函数有什么区别?

时间:2016-11-12 06:39:30

标签: c linux memory cpu-architecture

typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len) {
    size_t i;
    for (i = 0; i < len; i++)
        printf(" %.2x", start[i]);    //line:data:show_bytes_printf
    printf("\n");
}

void show_integer(int* p,size_t len){
    size_t i;
    for(i=0;i<len;i++){
       printf(" %d",p[i]);
    }
    printf("\n");
}

假设我上面有两个函数,我使用main函数来测试我的函数:

int main(int argc, char *argv[])
{
    int a[5]={12345,123,23,45,1};
    show_bytes((byte_pointer)a,sizeof(a));
    show_integer(a,5);
}

我在终端上得到了以下结果:

ubuntu@ubuntu:~/OS_project$ ./show_bytes
39 30 00 00 7b 00 00 00 17 00 00 00 2d 00 00 00 01 00 00 00
12345 123 23 45 1

有人能告诉我为什么会得到结果吗?我理解第二个函数,但我不知道为什么第一个函数得到39 30 00 00 7b 00 00 00 17 00 00 00 2d 00 00 00 01 00 00 00。实际上我知道上面的数字序列是1234512323451的十六进制小数。但是,我不知道:start[i]指针并未指向第一个函数中的整数,例如12345123。相反,start[0]只是指向第一个数字12345的最低有效数字?有人可以帮我解释为什么这两个函数不同吗?

2 个答案:

答案 0 :(得分:2)

十六进制中

123450x3039。因为int在您的机器上是32位,它将表示为0x00003039。那么因为你的机器是小端,它将被表示为0x39300000。您可以在https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html

上阅读有关Big和Little endian的更多信息

同样适用于其他结果。

答案 1 :(得分:2)

在您的平台上,clanggcc,您的平台使用小端系统。使用32位表示的sizeof(int)的二进制表示是:

4

在小端系统中,使用以下字节序列捕获。

12345

以十六进制表示,这些字节为:

00000000 00000000 00110000 00111001

这就是你所看到的与第一个数字相对应的输出。

您可以对数组中的其他数字进行类似的处理,以了解与它们对应的输出。