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

标签 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。其实我知道上面的数列是12345, 123, 23, 45, 的十六进制小数1。但是,我不知道:start[i] 指针没有指向第一个函数中的整数,例如 12345123 .相反,start[0] 只是指向第一个数字 12345 的最低有效位?谁能帮我解释一下为什么这两个函数不同?

最佳答案

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

其他结果同理。

关于c - 这两个 C 函数在处理内存方面有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560257/

相关文章:

c - 如何从 C 中的字符串中删除回车?

c++ - 对 `pthread_key_create' 的 undefined reference ;参数顺序不能解决问题

linux - 如果不是 gcc -static 那么 shell 说 'no such file'

c - 错误./thrash : free(): invalid pointer

在函数中复制结构体并在c中返回副本

java - 设置 Java 堆大小不适用于 256GB RAM 64 位机器

c - 商店订购大于原始尺寸的类型 - C 规范

c - 如何使用 recv 接收长文本字符串

c - 在 Raspberry Pi 上构建源代码

c - 使用 strtok 在 C 中处理文本在 EOF 处遇到错误