【问题标题】:What is the difference between these two C functions in terms of handling memory?这两个 C 函数在处理内存方面有什么区别?
【发布时间】:2017-03-26 09:48:39
【问题描述】:
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 的最低有效数字?谁能帮我解释一下为什么这两个功能不同?

【问题讨论】:

    标签: c linux memory cpu-architecture


    【解决方案1】:

    12345 是十六进制的0x3039。因为 int 在您的机器上是 32 位的,所以它将表示为 0x00003039。那么因为你的机器是小端的,它会被表示为0x39300000。你可以阅读更多关于大端和小端的信息:https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html

    这同样适用于其他结果。

    【讨论】:

    • 但是为什么那个byte_pointer只指向0x00003039的一些数字,比如00或39,为什么它没有指向整个数字0x00003039呢?在第二个函数中 p[i] 指的是整数 12345,但在第一个函数中, start[i] 只指 00 或 39 而不是整数 0x00003039(12345)
    • 因为你在第一个中逐字节读取它,在第二个中读取整个 int,一个 int 是 4 字节(在你的机器上)
    【解决方案2】:

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

    00000000 00000000 00110000 00111001
    

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

    00111001 00110000 00000000 00000000
    

    在十六进制中,这些字节是:

    39 30 00 00
    

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

    你可以对数组中的其他数字做类似的处理,以了解它们对应的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多